gpt4 book ai didi

java - Generic 中的类型转换错误

转载 作者:行者123 更新时间:2023-12-01 16:51:26 25 4
gpt4 key购买 nike

我刚刚开始学习 Generic。在这里,我尝试将全局 obj 的值设置为本地 obj 的值。但是我收到类型转换错误。此错误的原因是什么?

class GenUpperBound<T>
{
T obj;
public <T extends Number> void set(T obj)
{
this.obj=obj;
}

public static void main(String...q)
{
GenUpperBound<Integer> w=new GenUpperBound<>();
w.set(10);
}
}

这是错误......

GenupperBound.java:6: error: incompatible types: T#1 cannot be converted to T#2
this.obj=obj;
^
where T#1,T#2 are type-variables:
T#1 extends Number declared in method <T#1>set(T#1)
T#2 extends Object declared in class GenUpperBound
1 error

最佳答案

构造函数范围的类型参数 <T extends Number> 隐藏类范围的类型参数 <T> 。那两个T不代表同一类型。

这就是编译器拒绝编译代码的原因,因为构造函数中的参数可能与类参数化的类型不同。例如:

new GenUpperBound<String>(new Integer(1));

如果将构造函数范围的类型参数名称更改为 U,则可以清楚地看到差异。 :

class GenUpperBound<T> {

T obj;

public <U extends Number> void set(U obj) {
this.obj=obj;
}

...
}

现在编译也很好,但是 TU 明显代表不同的类型。

<小时/>

您可以通过以下方式解决此问题:

class GenUpperBound<T extends Number> {

T obj;

public void set(T obj) {
this.obj=obj;
}
...
}

现在没有第二个 T类型参数,但构造函数使用类范围的参数。在这种情况下,语句如 new GenUpperBound<String>(new Integer(1));将无法编译,因为参数与实例参数化的类型不同。

关于java - Generic 中的类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367289/

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