我不确定以下代码中的最后一条语句为何非法。Integer
应该是的子类型?
,那么为什么不能将其分配给b
?
List<String> a = new ArrayList<String>();
a.add("foo");
// b is a List of anything
List<?> b = a;
// retrieve the first element
Object c = b.get(0);
// This is legal, because we can guarantee
// that the return type "?" is a subtype of Object
// Add an Integer to b.
b.add(new Integer (1));
关键是b
指向 某种 类型的列表,但是编译器不知道该类型是什么,因此它不 知道 向其添加类型是否有效Integer
。举个例子,这也是一件好事-
您将向Integer
最初创建的用于保存字符串列表的对象添加一个。当然,这些信息在Java执行时会丢失-但是编译器会尽力确保您的安全。
见Java泛型常见问题解答了
很多 的更多信息。
问题内容: 我有一个通用类,说: 在此类的方法内部,我想测试T的类型,例如: 我怎样才能做到这一点 ? 谢谢你的帮助 问题答案: 通常,由于类型擦除,您不能这样做。有关更多详细信息,请参见Angelika Langer的Java泛型常见问题解答 。 您 可以 做的是将a传递给构造函数,然后检查: 请注意,尽管如此,Java仍不允许将原语用于类型参数,因此实在不行。
问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。
所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?
问题内容: 阅读Java在线教程,我对通配符捕获一无所知。例如: 为什么编译器无法保留分配的安全性?它知道,例如,通过执行带有整数列表的方法,它可以从i.get中获取一个整数值。因此,它尝试将索引0处的Integer值设置为相同的Integer列表(i)。那么,怎么了?为什么要编写通配符助手? 问题答案: 为什么编译器无法保留分配的安全性? 编译器不知道 任何 关于类型中的元素通过定义。通配符并
在阅读Java在线教程时,我对通配符捕获一无所知。例如: