首页  >  文章  >  Java  >  为什么我们不能在 Java 泛型中使用“super”关键字来限制类型参数?

为什么我们不能在 Java 泛型中使用“super”关键字来限制类型参数?

Linda Hamilton
Linda Hamilton原创
2024-10-31 16:22:30182浏览

Why Can't We Use 'super' Keyword for Type Parameter Bounds in Java Generics?

用“super”关键字限制泛型:全面解释

Java 泛型允许类型安全和代码可重用性。泛型的一方面是类型限制,其中类型参数可以被限制为特定的子类型关系。但是,与通配符不同,类型参数不能使用“super”关键字进行限制。

在 Collection 接口中,toArray 方法采用“S[]”类型的参数,其中“S”是类型参数。问题是为什么该方法没有声明为“”而不是通配符 ''。

答案在于“超级”边界的行为。虽然 'super' 通常与通配符一起使用 (),但将其应用于类型参数 (' 而不是 '>)意想不到的后果。 Object 是所有引用类型的超类,这意味着 'Object[]' 是 '>' 的有效参数在编译时。这违背了绑定的目的,因为任何引用类型参数都可以传递,即使那些不是“T”子类的参数也是如此。

因此,类型参数上的“超级”边界不会提供预期的保护无效的参数。为了说明,假设方法“>” S[] toArray(S[] a)' 和 ''因为“Integer”仍然允许“String[]”类型的参数,尽管“String”不是“Integer”的超类。由于“String[]”是“Object[]”,它将满足“super”界限。

此限制源于泛型和数组之间的相互作用。泛型和数组具有不同的协方差规则,从而导致观察到的行为。

需要注意的是,此限制仅适用于类型参数。仍然可以使用“super”来绑定通配符来表达方差,如“'在 toArray 方法中,允许更大的灵活性。

有关泛型和类型限制的更多见解,请参阅以下资源:

  • Java 教程/泛型
  • Java 泛型:什么是 PECS?
  • Java 泛型中 super 和 extends 有什么区别

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

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