假设我有带有两个参数的通用方法。
<T> void compare(T a, T b) {}
事实证明,可以传递任何类型的参数:T
可能总是被解析为 Object
,因为任何其他类型都是 Object
.
有没有办法让方法接受的参数完全相同的任何类型?
最佳答案
完全和同一个类(class)一样吗?不会。如果 A 和 B 共享一个父类 P,您始终能够将它们传递给一个需要 P
的泛型方法。 .
我认为限制它的唯一方法是添加如下参数:
<T> void compare(T a, T b, Class<T> clazz) {}
这会起作用,因为 Java 泛型是不变的,这意味着如果 A extends B
, G<A>
和G<B>
是完全不相交的类型(一个不扩展另一个)。例如,List<Person>
和List<Student>
即使 Student extends Person
也是不兼容的类型。这并不直观,只是语言的限制,其他一些语言(例如 Scala)可以选择创建泛型类型:
- 不变(就像 Java)
- 协变(如果
A extends B
则G<A> extends G<B>
) - 逆变(如果
A extends B
则G<B> extends G<A>
)
关于java - 限制通用向上转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61190372/