我正在为SCJP / OCPJP学习,并且遇到了一个对我来说很奇怪的示例问题。
该示例代码实例化了两个通用集合:
List<?> list = new ArrayList<?>();
List<? extends Object> list2 = new ArrayList<? extends Object>();
该问题的“正确”答案是该代码可以编译,但是添加到任何一个集合中都会产生运行时错误。
当我尝试像这样编译代码时,我只会得到错误。 Java教程甚至没有显示这种类型的代码,而是通常使用通配符作为转换的一部分。
Collection<?> c = new ArrayList<String>();
上面的两个通用集合甚至是合法代码吗?根据我的逻辑,第二个将只禁止接口。第一个看起来完全没用。为什么要使用不尝试控制的泛型?
java大神给出的解决方案
查看出色的Java generics tutorial PDF。更具体地说,有关通配符的部分包含您问题的答案,我引用
Collection<?> c = new ArrayList<String>();
c.add( new Object() );
由于我们不知道c
的元素类型代表什么,因此我们无法
向其添加对象。 add()
方法采用E
类型的参数,
集合的元素类型。当实际类型参数为?
时,
它代表某种未知类型。我们传递来添加的任何参数都会
必须是此未知类型的子类型。因为我们不知道
类型,即我们不能传入任何内容。唯一的例外是null
,
是每种类型的成员。
我想运行名称以ResourceTest.java结尾的测试类,因此我在执行后定义了它们。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <co…
如何告诉Checker遗留方法将接受Nullable类型? - java考虑一下:@Nullable Object obj = null; Optional<Object> optional = Optional.ofNullable(obj); 这会失败,因为检查器框架假定ofNullable无法接受null值(毕竟,其参数未标记为@Nullable)。有没有办法告诉Checker-framework这个方法(或我…
Java中的“ <<”运算符 - java最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…
页面加载而不是提交时发生struts验证 - java请原谅我;我对Struts有点陌生。我遇到一个问题,即页面加载而不是我实际提交表单时发生了验证。我整天都在论坛上搜寻和搜寻,没有任何运气。我显然做错了一些事情,应该很容易确定,但是我还没有发现问题所在。这是我的struts.xml的片段:<action name="*Test" method="{1}" clas…
Tomcat找不到直接放置在classes文件夹下的类 - java我有以下JSP:<%@ page import="foo.*" %> <html> <body> The page count is: <%=Counter.getCount()%> </body> </html> 我在包Counter中有一个foo类,该类存储在: …