在this topic中,我面临的是内嵌类型。
问题1.在中,隐式类型的强防御是什么?还是它是非正式概念?我可以手动定义隐式类型吗?所有隐式类型都是相同的,是真的吗?编译器的隐式类型是什么?
以下代码示例:
List<? extends Number> nums= new ArrayList<Integer>();
nums.add(3);//error我知道我们可以将nums引用分配给ArrayList<Double>。
问题2.在这个上下文中? extends Number是隐式类型,由CAP#1定义。编译器确实知道只有null是这种隐式类型的实例吗?
发布于 2013-10-11 12:19:10
恰当的术语是捕获通配符。编译器在内部将泛型类型的通配符实例化转换为捕获通配符。捕获表示类型参数的特定未知类型。当然,这种特殊的未知类型是通配符所表示的类型家族的成员。
注意,由于可以有许多不同的类型可以用通配符实例化来表示,所以我们说通配符表示一个参数化类型的不同实例化的系列。
我可以手动定义隐式类型吗?
匿名类型变量?不是的。它是由编译器内部创建的。可以这样说,您正在指示编译器创建一个匿名类型参数,该参数将替换使用的通配符。
所有隐式类型都是相同的,是真的吗?
不是的。如果您使用两倍于不同类型的List<? extends Number>,它们都会生成不同的匿名类型,即CAP#1 extends Number和CAP#2 extends Number。
编译器的隐式类型是什么?
我不明白这些问题。
编译器确实知道只有
null是这种隐式类型的实例吗?
添加null的原因是,null对于任何类型的引用都是一个有效的值。因此,不管通配符所代表的实际类型参数是什么,都会很高兴地接受值null。
发布于 2013-10-11 12:13:53
您不能将任何内容放入使用扩展通配符声明的类型中,除非值null,的值为,它属于每个引用类型。
List<Integer> ints = Arrays.asList(1,2,3);
List<? extends Number> nums = ints;
nums.add(null); // ok
assert nums.toString().equals("[1,2,3,null]");通常,如果一个结构包含具有? extends E格式类型的元素,我们可以从结构中获取元素,但是我们不能将元素放入结构中(null除外)。要将元素放入结构中,我们需要super通配符:
List<Number> nums = new ArrayList<Number>();
nums.add(2);
nums.add(3.14);
List<? super Integer> ints = nums;
ints.add(3);
ints.add(null);结果:[2, 3.14, null]
https://stackoverflow.com/questions/19317697
复制相似问题