gpt4 book ai didi

java - 为什么这些泛型不能在 OpenJDK7 中编译,但可以在 OpenJDK6 中编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:28 27 4
gpt4 key购买 nike

class HasId<I> {}
class HasStringId extends HasId<String> {}
class Alert<T extends /*Some*/Object> extends HasStringId {}
class BaseController<M extends HasId<String>> {
// abstract Class<M> getModelClass();
}
class AlertController extends BaseController<Alert> { // error here
// @Override Class<Alert> getModelClass() {
// return Alert.class;
// }
}

在 OpenJDK6 上编译良好,但在 OpenJDK7 上给出:

AlertController.java:50: error: type argument Alert is not within bounds of
type-variable T
class AlertController extends BaseController<Alert> {
^
where T is a type-variable:
T extends HasId<String> declared in class BaseController

请注意第 50 行有 rawtype 警告,因为 Alert 必须参数化。如果我这样做,例如extends BaseController<Alert<Object>> ,代码编译。但我不能那样做,因为我需要实现 getModelClass()。

更新:这是 Java 6 实现中的一个错误,已在 Java 7 中修复:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6559182 . (这是我对编译器开发人员的问题:http://openjdk.5641.n7.nabble.com/Nested-generics-don-t-compile-in-1-7-0-15-but-do-in-1-6-0-27-td121820.html)

最佳答案

问题是HasId<String>是否是原始类型的父类(super class)型 Alert .规范在这个问题上不是很清楚。

在 [4.8] 的精神中,原始类型的父类(super class)型也应该都是删除类型。所以Alert应该有一个父类(super class)型 HasId , 但不是 HasId<String> .然而,该部分只讨论“父类(super class)/接口(interface)”,而不是“父类(super class)型”。

本着 [4.10] 的精神,父类(super class)型是通过直接父类(super class)型发现的。目前尚不清楚该部分如何应用于原始类型。它可能打算规定原始 Alert有一个直接父类(super class)型 HasStringId .这似乎很公平。那么因为HasId<String>HasStringId 的直接父类(super class)型,通过传递性,HasId<String>Alert 的父类(super class)型!

混淆的根源在于实际上有两个 HasStringId类型,一种正常,一种原始。尽管HasStringId本身不是泛型的,它有一个泛型父类(super class)型,所以谈论 HasStringId 的原始版本是有意义的.

规范没有区分正常和原始 HasStringId .这是一个疏忽。

假设我们表示原始 HasStringId作为HasStringId' ,那么 [4.10] 现在更有意义了。 raw的直接super接口(interface)Alert是原始的 HasStringId' . raw的直接super接口(interface)HasStringId'是原始的 HasId .因此HasIdAlert 的父类(super class)型, 不是 HasId<String> .

参见 section 4 of JLS .我在这里链接到以前的 JLS,因为 JLS 7 在第 4.10.2 节中有严重的编辑错误

关于java - 为什么这些泛型不能在 OpenJDK7 中编译,但可以在 OpenJDK6 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15330632/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com