Я изо всех сил пытаюсь понять, как реализовать дженерики и сравнить их с моим кодом. Мне поручено преобразовать приведенный ниже метод в правильные общие методы. Мне также нужно переключить параметры с правильными дженериками.
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>
.