java - 无法将有效常量(值)分配给通用类型变量
问题描述
为什么以下不起作用?
void execute() {
Integer a = Integer.valueOf(1);
a = reassign(a);
D.log("a: " + a);
}
<T extends Integer> T reassign(T t) {
t = Integer.valueOf(2); // error: incompatible types: Integer cannot be converted to T
// t = (T) Integer.valueOf(2); // This works but with warning: [unchecked] unchecked cast
return t;
}
<T extends Integer> T reassign2(T t, T anotherT) {
t = anotherT; // This works without any warning.
return t;
}
我的理解是泛型方法/类/接口将被编译为单个类文件,其中类型参数被替换为最合适的下限(在上述情况下为整数)。
Java 环境:java 11.0.4 2019-07-16 LTS
解决方案
我的理解是泛型方法/类/接口将被编译为单个类文件,其中类型参数被替换为最合适的下限
您的理解是正确的,但编译器旨在更智能地处理泛型。如果编译器完全按照您描述的方式设计,那么泛型有什么意义?我可以写一个方法来Integer
代替。不需要泛型,因为编译器只会替换我拥有的任何类型参数Integer
。
您已指定T
必须是Integer
或 的子类Integer
。想一想什么时候T
是 的子类的情况Integer
,下面的赋值仍然有效吗?它不会!
t = Integer.valueOf(2); // you are assigning an instance of a superclass to a subclass variable
您可能会争辩说Integer
不能有任何子类final
,但编译器并非旨在检查final
这种情况下类的完整性。在这里使用Integer
as a bound 可能意味着它reassign
根本不应该是通用的。
编译器做的另一件事是在必要时插入强制转换,但这与这个问题并不真正相关。
推荐阅读
- rundeck - Rundeck - 生成新令牌后在哪里更新 rundeck 身份验证令牌?
- javascript - Javascript:根据嵌套的 start_date 和 end_date 对数据进行排序
- monit - M/Monit 更改/重置管理员密码
- docker - 如何找出卷属于哪个容器?
- python - 是否可以通过 cypari2 使用 Pari 并行化 python 代码?
- python - 如何从 BigQuery 表中提取所有列名的列表?
- r - 计算时间差。R
- python - Python中的平行向量点
- python - python bs4如何在一行中组合多个图像url?
- java - Java 属性或类变量或类字段等中的术语是否正确?非常感谢