java – 隐式类型和通配符


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?

不.如果您使用say List<? extends Number>两次不同的类型,它们都会生成不同的匿名类型,即CAP#1扩展Number和CAP#2扩展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.

点赞