compareTo(E) 泛型
compareTo(E) generics
您好,我对泛型有疑问。我需要使方法 "max" 通用,以便它可以用于不同类型的集合。
但我收到一个无法与 E 比较的错误
public static <E> E max(List<E> list) {
Iterator<E> iterator = list.iterator();
E maximum = iterator.next();
while (iterator.hasNext()) {
E x = iterator.next();
if (maximum.compareTo(x) < 0) {
maximum = x;
}
}
return maximum;
}
您必须要求 E
才能实施 Comparable<E>
:
public static <E extends Comparable<E>> E max(List<E> list) {
Iterator<E> iterator = list.iterator();
E maximum = iterator.next();
while (iterator.hasNext()) {
E x = iterator.next();
if (maximum.compareTo(x) < 0) {
maximum = x;
}
}
return maximum;
}
这让编译器知道只有 List
实现 Comparable
的元素可以传递给该方法。
@Eran 的答案对于您的用例来说可能已经足够好了,但是 max 函数的更灵活的签名是
static <E extends Comparable<? super E>> E max(List<E> list)
因此 Circle
class 扩展 Shape
class 实现 Comparable<Shape>
也可以。
您好,我对泛型有疑问。我需要使方法 "max" 通用,以便它可以用于不同类型的集合。
但我收到一个无法与 E 比较的错误
public static <E> E max(List<E> list) {
Iterator<E> iterator = list.iterator();
E maximum = iterator.next();
while (iterator.hasNext()) {
E x = iterator.next();
if (maximum.compareTo(x) < 0) {
maximum = x;
}
}
return maximum;
}
您必须要求 E
才能实施 Comparable<E>
:
public static <E extends Comparable<E>> E max(List<E> list) {
Iterator<E> iterator = list.iterator();
E maximum = iterator.next();
while (iterator.hasNext()) {
E x = iterator.next();
if (maximum.compareTo(x) < 0) {
maximum = x;
}
}
return maximum;
}
这让编译器知道只有 List
实现 Comparable
的元素可以传递给该方法。
@Eran 的答案对于您的用例来说可能已经足够好了,但是 max 函数的更灵活的签名是
static <E extends Comparable<? super E>> E max(List<E> list)
因此 Circle
class 扩展 Shape
class 实现 Comparable<Shape>
也可以。