我刚刚开始学习Generic.Here我正在尝试将全局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
答案 0 :(得分:4)
构造函数范围的类型参数<T extends Number>
隐藏类范围的类型参数<T>
。这两个T
&#39}并不代表相同的类型。
这就是编译器拒绝编译代码的原因,因为构造函数中的参数可能与类型不同,通过该类型参数化类。例如:
new GenUpperBound<String>(new Integer(1));
如果更改构造函数范围的类型参数,则可以明显看出 。名称为U
:
class GenUpperBound<T> {
T obj;
public <U extends Number> void set(U obj) {
this.obj=obj;
}
...
}
现在编译也很好,但T
和U
明确代表不同的类型。
您可以使用以下方法解决此问题:
class GenUpperBound<T extends Number> {
T obj;
public void set(T obj) {
this.obj=obj;
}
...
}
现在没有第二个T
类型参数,但构造函数使用类范围的参数。在这种情况下,new GenUpperBound<String>(new Integer(1));
之类的语句将无法编译,因为参数的类型与参数化实例的参数类型不同。
答案 1 :(得分:1)
试试这个:
class GenUpperBound<T extends Number>
{
T obj;
public void set(T obj)
{
this.obj=obj;
}
public static void main(String...q)
{
GenUpperBound<Integer> w=new GenUpperBound<>();
w.set(10);
}
}
答案 2 :(得分:0)
您必须声明您的课程
class GenUpperBound<T extends Number>
因为否则您的obj
可能是String类型,而您无法为字符串分配数字。