在试图理解java泛型类型和通配符“?”的用法时,我尝试了以下方法:
list
li=new arraylist
();
list
li2=new arraylist
();
li2.add(新整数(6));
li=li2;
li.add(new Integer(5));
我得到以下编译错误(使用Oracle JDeveloper作为IDE):
Error(24,9): cannot find method add(java.lang.Integer)
为什么上面的代码不能编译,而赋值li=li2
却可以呢?另外,如果我想调用li.add(...)
,什么是可接受的参数值?
?
是通配符类型,包含所有引用类型。要分配给类型?
的值必须可分配给任何引用类型。Integer
不能分配给所有引用类型(例如,string s=new Integer(1);
失败)。事实上,在Java中,可分配给所有引用类型的唯一值是null
,这是可以添加到list<?>
的唯一值
其他有趣的组合:
<代码>?超级数字是一个范围,包括类型对象
和数字
。当您编写这样一个值时,它必须同时是object
和number
,即。整数
就可以了。当读取这样的值时,它将是object
或number
(所以,object
)。
<代码>?extends number是一个范围,包括类型number
及其所有子类型。当你写这样一个值,它必须是一个类型的所有子类型的数字,即。它必须为null
。当读取这样的值时,它将是数字
。
null 编译,我真的不明白为什么。基本上与第1行相同的问题。是的超类,如何将超类的成员放入此中? 编译。与第1行相同的问题。
根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者
我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?
问题内容: 我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。 我可以: 要么: 但我不能两者都做。有没有办法做到这一点? 问题答案: 实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样: 请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根
问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。
所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?