3 回答
TA贡献1829条经验 获得超9个赞
为什么我不能投射 a
List<List<Object>>
toList<Object>
?不是List<Object>
也Object
吗?
因为Java 泛型不是隐式多态的。。List<Object>
意味着它可以Object
在给定列表中包含任何内容,甚至是 a Map<?, ?>
,但是当您将其转换为 a 时List<List>
,包含任何内容不再有意义Object
,并且仅限于List
使用时效果如何
Collections.singletonList()
?
仅仅是因为按照文档Collections.singletonList()
返回 a ,所以编译器不会在运行时抱怨它。
TA贡献1805条经验 获得超9个赞
答案的两部分: List<Object>
是不变的,因此键入的表达式List<List<? extends java.lanq.Object>>
不能分配给List<Object>
Google 以获取 Java 中的方差,例如: DZone 关于 Java 中方差的文章
public static <T> List<T> singletonList(T o)
是一个通用方法。对于泛型方法,应用类型推断。在您的上下文中,T 应该是一个对象,并且List<List<? extends java.lanq.Object>>
可以转换为对象。
TA贡献1793条经验 获得超6个赞
您应该看看 Java 中的类型擦除和原始类型。
列表使用泛型,因此当您尝试使用定义原始类型创建列表时,它会使用Object
List list;
// means that list holds Objects
List<String> listOfStrings;
// means that list holds Strings
现在的情况是List<List>
列表是一个interface没有合适的转换的对象,因为Object在评估此语句时,JVM 会注意到您尝试使用既不是对象也不是“它的子对象”的项目
List<List<? extends java.lanq.Object>> // (Object or children of it)
添加回答
举报