首页  >  文章  >  Java  >  为什么不能使用“super”关键字来绑定 Java 泛型中的类型参数?

为什么不能使用“super”关键字来绑定 Java 泛型中的类型参数?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 09:21:02844浏览

Why can't the 'super' keyword be used to bound type parameters in Java generics?

用“super”关键字绑定泛型:详细说明

问题:为什么不能使用“super”关键字绑定类型参数,与通配符不同?

答案:

不允许使用“super”(例如“”)来限制类型参数Java,因为它实际上对类型绑定的影响可以忽略不计,并且不会达到其预期目的。

考虑以下假设的代码:

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

此代码建议使用 'toArray' 方法在“Collection”接口中应该有一个类型参数“S”,它是“T”的超类型。然而,这个界限是没有意义的,因为每个类型都是“Object”的超类型,并且由于任何引用类型的数组都可以转换为“Object[]”,编译器将允许将任何数组作为参数传递给'toArray',无论它是否是预期的子类型。

因此,使用 'super' 绑定类型参数不会防止运行时错误,例如 'ArrayStoreException'。因此,它在 Java 的类型系统中是不允许的。

示例:

考虑一个假设的泛型方法:

<T super Integer> void add(T number)

此方法旨在允许添加“整数”、“数字”和“对象”(因为它们都是“整数”的超类),但不允许添加“字符串”,因为它们不是。但是,由于“Object”是“Integer”的超类,因此仍然可以通过隐式转换添加“string”,从而导致潜在的运行时错误。

其他注意事项:

  • 泛型和数组:泛型和数组有固有的局限性,它们不能无缝混合。
  • 使用“super”的替代方案:为了在这种情况下实现类型安全,建议使用通配符或方法重载,而不是使用 'super' 来限制类型参数。

相关资源:

  • Java 教程/泛型

    • 子类型
    • 通配符的更多乐趣
  • Java 泛型:什么是 PECS? (生产者扩展消费者super)
  • Java泛型中super和extends有什么区别

以上是为什么不能使用“super”关键字来绑定 Java 泛型中的类型参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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