首页  >  文章  >  Java  >  为什么 Java 泛型中的“super”关键字仅限于通配符而不是类型参数?

为什么 Java 泛型中的“super”关键字仅限于通配符而不是类型参数?

Barbara Streisand
Barbara Streisand原创
2024-11-02 07:20:02687浏览

Why is the `super` keyword restricted to wildcards and not type parameters in Java generics?

泛型与 'super' 关键字绑定

有人可能想知道为什么 super 关键字只适用于通配符,而不适用于 Java 泛型中的类型参数。考虑 Collection 接口中的以下示例,其中 toArray 方法不是这样声明的:

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}

此语法将导致非法声明,要理解其原因,需要探索将 super 与命名一起使用的含义类型参数。

类型参数中 'super' 的限制

使用 super 绑定命名类型参数 () 将无法实现预期的效果。由于 Object 是所有引用类型的最终超类,因此任何引用类型数组都可以转换为 Object[]。这意味着即使使用假设的语法,以下代码仍然会编译并在运行时导致 ArrayStoreException:

List<Integer> integerList;
integerList.toArray(new String[0]);  // should be disallowed, but compiles

因此,不允许使用 super 与命名类型参数,以防止无法强制执行的错觉

泛型和数组:复杂的关系

另一个需要考虑的方面是泛型和数组之间的复杂交互。在 Java 中,数组的处理方式与其他集合类型不同,导致在强制类型安全方面受到限制。这解释了为什么泛型类型边界无法阻止给定示例中的 ArrayStoreException。

使用 'super' 进行非法边界的示例

为了进一步说明该问题,请考虑一种假设方法声明:

<T super Integer> void add(T number)  // hypothetical! currently illegal

使用此语法,人们可能期望它接受 Integer 和 Number 实例,但不接受 String。然而,由于 String 是 Object 的子类,而 Object 是 Integer 的超类,因此 add(aString) 仍然有可能编译,从而导致潜在的错误。

结论

总之,使用具有命名类型参数的 super 受到限制,以确保类型安全并防止无效假设。 Java 中的泛型和数组具有独特的特征,这些特征限制了使用 super 绑定类型参数的有效性。

以上是为什么 Java 泛型中的“super”关键字仅限于通配符而不是类型参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn