gpt4 book ai didi

java - 无法将有效常量(值)分配给通用类型变量

转载 作者:行者123 更新时间:2023-12-02 01:17:47 25 4
gpt4 key购买 nike

为什么以下不起作用?

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;
}

我的理解是,泛型方法/类/接口(interface)将被编译为单个类文件,其中类型参数被替换为最合适的下限(在上述情况下为整数)。

Java 环境:java 11.0.4 2019-07-16 LTS

最佳答案

My understanding is that generic methods/classes/interfaces will be compiled to a single class file where the type parameter is replaced with most appropriate lower bound

您的理解是正确的,但编译器旨在更智能地处理泛型。如果编译器的设计完全按照您所描述的方式设计,那么泛型的意义何在?我可以编写一个采用 Integer 的方法。不需要泛型,因为编译器将只是Integer替换我拥有的任何类型参数。

您已指定 T 必须是 IntegerInteger 的子类。想想当TInteger的子类时的情况,下面的赋值仍然有效吗?不会的!

t = Integer.valueOf(2); // you are assigning an instance of a superclass to a subclass variable

您可能会争辩说,Integer 不能有任何子类,因为它是 final,但编译器并非旨在检查 final 性在这种情况下的类(class)。此处使用 Integer 作为界限可能意味着重新分配根本不应该是通用的。

<小时/>

编译器做的另一件事是在必要时插入强制转换,但这与这个问题并不真正相关。

关于java - 无法将有效常量(值)分配给通用类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com