来自安洁莉卡·兰格的通用常见问题解答:
覆盖类型参数。
当编译器找到泛型类型或方法的定义时,它会删除所有出现的类型参数,并将其替换为最左边的绑定,如果未指定绑定,则为Object类型。
编辑:正如我在这种情况下所理解的那样,最左边的界限意味着字面意思,即边界列表中最左边。我想了解为什么选择这项政策?
没有理由。他们只需要选一个。整件事糟透了。这就像问你想救哪个孩子。你想救所有人,废话。但是他们不让你。
在这种情况下,“最左边”不是技术术语。它的字面意思是“最左边”。它只是意味着当类型参数有几个边界(限制)时,如下所示:
T extends Callable<Long> & Runnable
编译器将所有出现的类型参数T
替换为最左边的绑定(在本例中为可调用
意思是,就像安吉莉卡的例子一样,这个:
private T task1, task2;
替换为:
private Callable task1, task2;
问题内容: 在Java中,Map接口定义为 为什么不? 我刚遇到一个讨厌的错误,因为使用了错误的类型密钥。我认为泛型的目的是在编译期间及早捕获类型错误。这会达到目的吗? 问题答案: 凯文·布罗里恩(Kevin Bourrillion)不久前就在博客上发表了文章。摘要: 一致地,除非有必要防止集合损坏,否则Java Collections Framework(以及Google Collections
问题内容: 该链接指出以下内容: 具有实际类型参数的泛型类型的实例化称为参数化类型。示例(参数化类型): 那么什么是参数化类型? 要么 问题答案: 它们都是参数化类型:以其他类型为参数的类型。 您在表达式的两侧具有不同类型的事实是无关紧要的,并且与多态行为有关,即因为是的子类型。
在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。 泛型方法的语法为 文件上说 为了彼此保持一致,我希望方法语法为 ,或者类型语法(for class)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指
问题内容: 我是从Joshua Bloch的google I / O困惑者演讲中得到的。这是代码 这个main方法会引发异常,因为它是原始类型,因此in中的所有泛型都将被删除,因此最终调用而不是。 我的问题是,即使我打电话是不是应该把它调用的方法,因为由于类型擦除,这种方法是有效的并且是类型的不是? 问题答案: 被调用的方法是在编译时定义的,而不是在运行时定义的。 如果在构造函数调用中添加参数,则
以下方法返回由type元素组成的列表: 在签名中我们有
下面对getHighest()和getLowest()的调用返回Comparable类型的对象,而不是T类型的对象,这正是我们想要的。为什么,我该如何改进这段代码,使这些调用返回T(这样T的字段和方法就可用了)? 下一行生成编译器错误: 错误:找不到符号符号:方法getName()位置:接口java.lang.Comparable 我想employee.getHighest()返回一个员工(而不仅