假设我们有
class Fruit implements Comparable<Fruit>
{
@Override
public int compareTo(Fruit o) { return 0; }
}
class Apple extends Fruit{}
class Main
{
public static void main (String args[])
{
function(new Apple()); // this shouldn't work because Apple is implementing Comparable<Fruit>, not Comparable<Apple>
}
public static<T extends Comparable<T>> void function(T t){}
}
代码正常运行。
我的问题是为什么<T extends Comparable<T>>
像<T extends Comparable<? super T>>
一样工作。有什么不同 ?
感谢。
[编辑] - 书中的一段 Image
答案 0 :(得分:0)
在这种情况下,beacuse类Fruit
是其自身的超类
不同之处在于
<T extends Comparable<T>>
接受与type T
的争论相比较
<T extends Comparable<? super T>>
接受与type T and its super classes
的争论相比较。这里因为在java中,每个类都是它自己的超类,Fruit is also a superclass of Fruit
。这就是为什么你看到它们以同样的方式工作
但如果您使用Apple
作为T
,则会看到差异。
答案 1 :(得分:0)
我认为您使用Java 8进行编译。 因为,在Java 8之前,您不应该传递编译并出现此错误:
绑定不匹配:Main类型的泛型方法函数(T)不是 适用于论点(Apple)。推断类型Apple不是 有效参数&gt;
的有效替代
我认为你在书中看到的内容是指Java 8之前的泛型用法
但我不知道Java 8对这种情况的限制较少。
在Java 8中大量使用推理的副作用是Java 8调用&#34;改进的推理&#34; ?