泛型与 '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中文网其他相关文章!