在this topic我遇到了隐式类型。
问题 1.Java 中对隐式类型的强定义是什么,或者它是非形式化的概念?我可以手动定义隐式类型吗?所有的隐式类型都是一样的吗?编译器的隐式类型是什么?
以下代码示例:
List<? extends Number> nums= new ArrayList<Integer>();
nums.add(3);//error
我知道我们可以分配给 nums
引用ArrayList<Double>
.
问题 2. 在这种情况下 ? extends Number
是隐式类型,由 CAP#1
定义.编译器确实只知道 null
是真的吗?是这个隐式类型的实例吗?
最佳答案
正确的说法是捕获通配符。编译器在内部将泛型类型的通配符实例化转换为通配符捕获。捕获表示类型参数的特定未知类型。当然,这个特定的未知类型是通配符表示的类型家族的成员。
请注意,由于通配符实例化可以表示许多不同的类型,因此我们说通配符表示参数化类型的一系列不同实例化。
Can i define implicit type manually?
匿名类型变量?不,那是由编译器在内部创建的。你可以这样说,你是在指示编译器创建一个匿名类型参数,它将替换所使用的通配符。
Is it true that all of implicit type is the same?
没有。如果你说 List<? extends Number>
两次不同的类型,它们都将生成不同的匿名类型,即 CAP#1 extends Number
和 CAP#2 extends Number
.
What's the implicit type for compiler?
我不明白这些问题。
Is it true that compiler does know that only
null
is instance of this implicit type?
添加null
的原因之所以有效是因为,null
是任何类型引用的有效值。因此,无论通配符代表的实际类型参数是什么,都会很乐意接受值 null
.
关于java - 隐式类型和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19317697/