Я изо всех сил пытаюсь понять, как реализовать дженерики и сравнить их с моим кодом. Мне поручено преобразовать приведенный ниже метод в правильные общие методы. Мне также нужно переключить параметры с правильными дженериками.
public static String min(String a, String b) {
if (a < b)
return a;
else
return b;
}
public static String max(String a, String b) {
if (a < b)
return b;
else
return a;
}
И это моя попытка
public static <AnyType> min(<AnyType> a, <AnyType> b) {
if (a < b)
return a;
else
return b;
}
public static <AnyType> max(<AnyType> a, <AnyType> b) {
if (a < b)
return b;
else
return a;
}
Ты прав. Я не знал о любом типе, хотя. Я попробую это и посмотрю, что произойдет
Вы должны убедиться, что AnyType сопоставимо.
public static <AnyType extends Comparable<AnyType>> AnyType min(AnyType a, AnyType b) {
return a.compareTo(b) < 0 ? a : b;
}
public static <AnyType extends Comparable<AnyType>> AnyType max(AnyType a, AnyType b) {
return a.compareTo(b) > 0 ? a : b;
}
Вы не сможете написать единственный метод compareTo, который будет работать для любого типа. Но вы можете написать min и max, которые будут правильно работать с любым типом implements Comparable.
Comparable — это интерфейс Java. У него есть метод compareTo, который не содержит кода. Для его использования требуется, чтобы метод compareTo был реализован для каждого класса, который его использует.
Использование интерфейса Comparable выглядит примерно так:
public class Foo implements Comparable<Foo> {
Это требует где-то в классе Foo этого:
public int compareTo (Foo someFoo) { ... }
Где ... заменен кодом, специфичным для Foo.
Тогда класс, которому нужно сравнить две переменные типа Foo, может иметь такой код:
Foo bar = new Foo();
Foo bin = new Foo();
...
if (bar.compareTo(bin) < 0) { ...
Если бы был другой класс, который implements Comparable, этому классу также потребовался бы compareTo метод, специфичный для этого класса.
Вы можете написать общие методы min и max, которые будут работать с несколькими классами, если эти классы реализуют Comparable. <T extends Comparable<T>> обеспечивает это.
public static <T extends Comparable<T>> T min (T a, T b) {
if (a.compareTo(b) <= 0) return a;
return b;
}
public static <T extends Comparable<T>> T max (T a, T b) {
if (a.compareTo(b) >= 0) return a;
return b;
}
Однако в этом случае дженерики не нужны. Java позволяет использовать имя интерфейса в качестве типа:
public static Comparable min (Comparable a, Comparable b) {
if (a.compareTo(b) <= 0) return a;
return b;
}
public static Comparable max (Comparable a, Comparable b) {
if (a.compareTo(b) >= 0) return a;
return b;
}
Э-э, String — это ссылочный тип, поэтому вы не можете использовать операторы отношения <, <=, >, >=. Вы должны получить ошибку компилятора для «исходного» кода, который вы пытаетесь преобразовать. То же самое относится и к <AnyType>.