Java泛型:递归类型的声明

3
在《Effective Java》中,我看到了一个声明:public static <T extends Comparable<T>> T max(List<T> list),类型变量T是一种可以与自身进行比较的类型。我的问题是,如果我从Comparable中删除<T>,那么有什么区别呢?我指的是下面这个方法:public static <T extends Comparable> T max(List<T> list)

这意味着你正在使用原始类型,而原始类型总是不好的。 - Louis Wasserman
2个回答

4
这意味着你将会得到一个可比较的类型,类似于 Object,因为在没有提供泛型类型的情况下,Java 会将泛型类型推断为Object
<T extends Comparable> // The generic type for Comparable is inferred as Object as it was not provided.

这意味着提供给列表的类型需要实现compareTo(Object o)并实现Comparable(请注意,Comparable缺少泛型类型),我认为这不是预期的。

然后我为max方法指定了一个字符串列表,但是String实现的是compareTo(String anotherString)而不是compareTo(Object o) - user2018791
@user2018791 当你使用<T extends Comparable<T>>时,提供一个List<String>将有效工作,因为String实现了Comparable<String> - SamTebbs33
但是,即使String实现了compareTo(String)而不是compareTo(Object),当我提供List<String>时,static <T extends Comparable> T max(List<T> list)仍然可以正常工作。 - user2018791

3

您可以以“原始方式”声明参数化类型来实现Comparable接口。

例如,class Foo implements Comparable(原始类型)将适合于您的参数化类型。

而该类可以重写compareTo(Object o)而不是compareTo(Foo f)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接