4

这个主题中,我遇到了隐含类型。

问题 1. Java 中隐式类型的定义或非形式概念是什么?我可以手动定义隐式类型吗?是否所有隐式类型都相同?编译器的隐式类型是什么?

以下代码示例:

List<? extends Number> nums= new ArrayList<Integer>();
nums.add(3);//error

我知道我们可以指定numsArrayList<Double>.

问题 2.在这种情况下? extends Number是隐式类型,由CAP#1. 编译器确实知道只有null这种隐式类型的实例是真的吗?

4

2 回答 2

2

正确的术语是捕获通配符。编译器在内部将泛型类型的通配符实例化转换为对通配符的捕获。捕获表示类型参数的特定未知类型。这个特定的未知类型当然是通配符所表示的类型家族的成员。

请注意,由于通配符实例化可以表示许多不同的类型,因此我们说通配符表示参数化类型的不同实例化系列。

我可以手动定义隐式类型吗?

匿名类型变量?不,这是由编译器在内部创建的。您可以这样说,您正在指示编译器创建一个匿名类型参数,该参数将替换使用的通配符。

是否所有隐式类型都相同?

不会。如果你使用 sayList<? extends Number>两次作为不同的类型,它们都会生成不同的匿名类型,CAP#1 extends NumberCAP#2 extends Number.

编译器的隐式类型是什么?

我不明白这些问题。

编译器确实知道只有null这种隐式类型的实例是真的吗?

添加null作品的原因是,null对于任何类型的参考来说,它都是一个有效值。因此,无论通配符表示的实际类型参数是什么,都会很乐意接受 value null

于 2013-10-11T12:19:10.230 回答
0

除了属于每个引用类型的 value之外null,您不能将任何内容放入使用 extends 通配符声明的类型中

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]");

一般来说,如果一个结构体包含了 form 类型的元素? 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]

于 2013-10-11T12:13:53.330 回答