为什么泛型方法调用的错误报告中的组件是有界的?

x7rlezfr  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(258)

在“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 组件?

osh3o9ms

osh3o9ms1#

······为什么会有 Comparable 部件?…”
热释光;医生-这很复杂。但我想得很简单:这三个都是因为 String (又名, T ,又名“hello”)实现所有三个。
长版
您看到的结果是编译器的三个类型推断过程之一失败。
本质上,类型推断试图弄清楚:“嗯,现在什么类型可以 T “是吗?”。它决定了 T 是一个 Array 什么的。
然后,它必须弄清楚,这些元素的具体类型是什么 Array 是。为了回答这个问题,它检查泛型方法的参数。它Assert了兼容性:“因为第一个参数的类型是 String 既然我已经知道我在处理一个 Array -以及 Array s总是保持相同的类型-那么其他两个参数在逻辑上也必须是同一类型 String “.
然后它做编译器的工作,相当于查看javadoc来找出 String 与兼容 Object & Serializable & Comparable .
这是一个高层次的“用简单的英语”概述,说明了为什么你会看到 Comparable 另外两个在你的错误信息里。如果你需要血淋淋的细节,请阅读我上面链接的jls的章节。

相关问题