Обобщения, компараторы и тестовые примеры

1

Это назначение является частью разделов для дженериков для моего класса Java. Я думаю, что у меня возникают проблемы, обертывающие мою голову вокруг общности, делая ее слишком общей. Для этого конкретного класса я должен реализовать min (и несколько других) методов для любой общей коллекции I, которую я даю, и использовать данный компаратор (comp) для их оценки.

Реализованный код:

public static <T> T min(Collection<T> c, Comparator<T> comp)
            throws IllegalArgumentException, NoSuchElementException {
        if (c != null && comp != null) {
            if (!c.isEmpty()) {
                T min = (T) null;

                for (T t : c) {
                    if (min == null) {
                        min = t;
                    } else if (comp.compare(t, min) < 0) {
                        min = t;
                    }
                }

                return min;

            } else {
                throw new NoSuchElementException();
            }
        } else {
            throw new IllegalArgumentException();
        }
    }

Моя проблема в том, что я не знаю, как протестировать этот метод с моими компараторами. Я объясню, что я прочитал/как я это понял, и было бы здорово, если бы вы, ребята, могли сказать мне, где я чего-то не хватает.

Если я хочу сравнить в классе (добавьте свой собственный метод compare/compareTo):

public class Example<T extends Comparator<T>> {

}

Если я хочу написать свой отдельный класс в качестве компаратора:

public class ExampleComp<T> implements Comparator<T> {
    @override
    public int compare(T o1, T o2) {
    //do fancy things here
    }
}

Это означает, что способ, которым я должен писать тестовые примеры, - это реализовать мой собственный класс компаратора и передать new ExampleComp() в качестве переменной в моем вызове метода.

Итак, если мое понимание того, что все правильно, как мне написать тестовый пример для сравнения чего угодно и всего? Предполагается, что коллекция должна быть как можно более общей, так как я могу реализовать методы для сравнения одной части с другой, сохраняя все типыafeafe?

  • 3
    Для тестирования вам нужно протестировать с конкретным классом и конкретным компаратором, а не с обычными вещами. Ваша реализация должна быть общей, но ваши тесты не могут быть.
  • 0
    Хорошо, это имеет смысл. Так я просто приведу <T> в int, string и т. Д.? И сравнить, как вы это обычно делаете с этими?
Показать ещё 3 комментария
Теги:
generics

1 ответ

1
Лучший ответ

В настоящее время все ваши типы являются инвариантными. Collection<T> представляет собой набор с типом компонента T. List<T> будет соответствовать этому типу, но Collection не будет. Существуют два других возможных определения компонентов с использованием подстановочных знаков, которые являются ковариантными (<? extends T>) и контравариантными (<? super T>) типами компонентов.

В вашем случае мы можем сделать ковариацию Collection, но это будет означать, что ваш тип результата будет зависать от типа Comparator. Таким образом, предпочтительным решением является сравнение контравариантного компаратора. Затем ваш метод будет выглядеть следующим образом:

public static <T> T min(Collection<T> c, Comparator<? super T> comp)
        throws IllegalArgumentException, NoSuchElementException {…}

Это работает, потому что наш comp примет любой Comparator, который сравнивает, по крайней мере, супертип T. Так что, если у вас есть class Person и подкласс VeryIncompetentPerson, Comparator<Person> будет достаточно, чтобы получить минимум из коллекции очень некомпетентных лиц,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню