java - 限制通用向上转换
问题描述
假设我有两个参数的通用方法。
<T> void compare(T a, T b) {}
事实证明,可以传递任何类型的参数:T
可能总是被解析为Object
,因为任何其他类型都是 a Object
。
有没有办法让方法接受完全相同的任何类型的参数?
解决方案
和同班一样吗?不。如果 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>
)
推荐阅读
- angular - 如何在Angular ngFor中判断哪些孩子是最后一个
- android - 某些三星设备的屏幕录制输出失真
- express - res.status 在 promise 函数中未定义
- amazon-web-services - AWS ARN 的最大长度是多少?
- java - 在注册码中加入一层密码校验码
- machine-learning - 如何将长句子分解为 5 到 10 个单词的句子并使用 LSTM 取得良好的效果?
- python - 如何按指定标准对 zip 对象列表进行排序?
- python - 使用 python ElementTree 我想找到所有标题
- angular - 使用角度路由器无法显示页面顶部
- java - 了解 HotSpot 中的通知方法