当前位置: 首页 > 知识库问答 >
问题:

使用带有通配符“?”的java泛型类型

上官扬
2023-03-14

在试图理解java泛型类型和通配符“?”的用法时,我尝试了以下方法:

  1. list li=new arraylist ();
  2. list li2=new arraylist ();
  3. li2.add(新整数(6));
  4. li=li2;
li.add(new Integer(5));

我得到以下编译错误(使用Oracle JDeveloper作为IDE):

Error(24,9):  cannot find method add(java.lang.Integer)

为什么上面的代码不能编译,而赋值li=li2却可以呢?另外,如果我想调用li.add(...),什么是可接受的参数值?

共有1个答案

轩辕经国
2023-03-14

是通配符类型,包含所有引用类型。要分配给类型的值必须可分配给任何引用类型。Integer不能分配给所有引用类型(例如,string s=new Integer(1);失败)。事实上,在Java中,可分配给所有引用类型的唯一值是null,这是可以添加到list<?>的唯一值

其他有趣的组合:

<代码>?超级数字是一个范围,包括类型对象数字。当您编写这样一个值时,它必须同时是objectnumber,即。整数就可以了。当读取这样的值时,它将是objectnumber(所以,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网站上的另一个示例: 为什么这不是写成 我错过什么了吗?