在“CoreJavaVolume1”中,horstmann从Petervonderah那里推荐了这个技巧é “故意引入错误。。。查看编译器为泛型方法调用推断的类型”。
例如:
//class ArrayAlg
public static <T> T getMiddle(T...a) {
return a[a.length/2];
}
分配结果如下:
JButton aButton = ArrayAlg.getMiddle("Hello", 0, null);
将给出以下错误报告:
found:
java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends
java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>
霍斯特曼解释说:“用简单的英语,你可以把结果分配给 Object
, Serializable
,或 Comparable
.
问题:
我不明白错误报告的最后一部分 ...&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>
.
为什么有一个边界 Comparable
组件?
1条答案
按热度按时间osh3o9ms1#
······为什么会有
Comparable
部件?…”热释光;医生-这很复杂。但我想得很简单:这三个都是因为
String
(又名,T
,又名“hello”)实现所有三个。长版
您看到的结果是编译器的三个类型推断过程之一失败。
本质上,类型推断试图弄清楚:“嗯,现在什么类型可以
T
“是吗?”。它决定了T
是一个Array
什么的。然后,它必须弄清楚,这些元素的具体类型是什么
Array
是。为了回答这个问题,它检查泛型方法的参数。它Assert了兼容性:“因为第一个参数的类型是String
既然我已经知道我在处理一个Array
-以及Array
s总是保持相同的类型-那么其他两个参数在逻辑上也必须是同一类型String
“.然后它做编译器的工作,相当于查看javadoc来找出
String
与兼容Object & Serializable & Comparable
.这是一个高层次的“用简单的英语”概述,说明了为什么你会看到
Comparable
另外两个在你的错误信息里。如果你需要血淋淋的细节,请阅读我上面链接的jls的章节。