首页 > 解决方案 > 限制通用向上转换

问题描述

假设我有两个参数的通用方法。

<T> void compare(T a, T b) {}

事实证明,可以传递任何类型的参数:T可能总是被解析为Object,因为任何其他类型都是 a Object

有没有办法让方法接受完全相同的任何类型的参数?

标签: javagenerics

解决方案


和同班一样吗?不。如果 A 和 B 共享一个父类 P,您将始终能够将它们都传递给期望 a 的泛型方法P

我能看到限制它的唯一方法是添加这样的参数:

<T> void compare(T a, T b, Class<T> clazz) {}

这将起作用,因为 Java 泛型是不变的,这意味着 ifA extends B和是完全不相交的类型(一个不扩展另一个)。例如,and是不兼容的类型,即使. 这不直观,只是语言的限制,其他一些语言(如 Scala)可以选择创建泛型类型:G<A>G<B>List<Person>List<Student>Student extends Person

  • 不变的(就像 Java 一样)
  • 协变(如果A extends B那么G<A> extends G<B>
  • 逆变的(如果A extends B那么G<B> extends G<A>

推荐阅读