|
|
1
8
这个 Java Language Specification, §8.1.3 ,定义子类化内部类型的语义,如下所示:
请注意,封闭实例仅被描述为具有特定的 班 ,不是特定的 类型 . 由于泛型类型的所有实例共享同一类,因此以下代码是合法的:
当然,这可以用来打破类型不变量(即原因) ):
eclipse编译器将Java语言规范作为面值,接受上述代码,甚至不发出“unchecked”警告。虽然可以说在技术上符合JLS,但这显然违背了它的意图。
sunjava编译器拒绝
显然,编译器并不像eclipse那样简单地检查类型参数与内部的超类的类型参数绑定。在这种情况下,我认为这样做是正确的,因为申报显然是不安全的。但是,Sun编译器同样拒绝以下声明,即使它是可证明的类型安全的:
我的预感是,验证这种菱形类型限制的一致性超出了Sun编译器的能力,因此,这样的构造会被立即拒绝。
为了克服这个限制,我首先尝试去掉
|
|
|
2
1
也许这并没有多大的进步,但我设法将上面的代码缩减为以下仍然表现出相同怪异行为的代码:
|
|
Fernando Chu · 一个变量有多个可能的类?[关闭] 1 年前 |
|
|
Amaterastis · 基类接受子类和内部子类的模板参数 1 年前 |
|
|
Rishab Negi · 这个关键字在抽象类中是如何工作的 1 年前 |
|
|
dEmigOd · 类层次结构中的运算符重载解析 1 年前 |
|
|
TableTopRug · 如何从Kotlin中的密封类继承? 1 年前 |
|
|
hasdrubal · 抽象基类函数指针python 2 年前 |
|
|
Josh · 通过反思访问孩子的财产 2 年前 |