当前位置: 首页 > 面试题库 >

Java泛型,通配符的嵌套集合

张通
2023-03-14
问题内容

这样编译(1.6)

List<? extends Object> l = new ArrayList<Date>();

但这不是

List<List<? extends Object>> ll = new ArrayList<List<Date>>();

的错误

Type mismatch: cannot convert from ArrayList<List<Date>> to List<List<? extends Object>>

有人可以解释为什么吗?谢谢

编辑:编辑为结果


问题答案:

因为这会破坏类型安全性:

List<List<Object>> lo = new ArrayList<List<Object>>();
List<List<? extends Object>> ll = lo;
List<String> ls = new ArrayList<String>();
ll.add(ls);
lo.get(0).add(new Object());
String s = ls.get(0); // assigns a plain Object instance to a String reference


 类似资料:
  • 问题内容: 为什么这样做: 虽然这会产生类型不匹配错误: 为什么是这样?是否有办法解决此问题,而不使用原始类型? 问题答案: 尝试 注意:请注意,当您使用类似List的集合时,您只能在“只读”模式下使用它(添加空值除外)。

  • 问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。

  • 所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?

  • 这2个功能有什么区别? 我看到了相同的输出。

  • 问题内容: 发现了有关使我烦恼的无限制通配符的事实。例如: 尽管可以使用或返回类型,但失败。 有人可以告诉我确切原因吗?提前致谢。 更新资料 我认为,对于此问题,我似乎理解并最简单的解释(忽略所有这些复杂的规则)是Capture Conversion(link)中的最后一个注释: 问题答案: 了解通配符类型的含义很重要。 您已经了解了,您可以将您的as 隐式指定为任意类型,而对于任何可能引用了声明

  • 问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个