Java 泛型中的类型转换错误

Java 泛型中的类型转换错误,java,generics,Java,Generics,我刚刚开始学习泛型。在这里我试图将全局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&l

我刚刚开始学习泛型。在这里我试图将全局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);
   }
}
类绑定
{
T-obj;
公共无效集(T obj)
{
obj=obj;
}
公共静态void main(字符串…q)
{
GenUpperBound w=新的GenUpperBound();
w、 组(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
GenupperBound.java:6:错误:不兼容的类型:T#1无法转换为T#2
obj=obj;
^
其中T#1,T#2是类型变量:
T#1扩展了方法集(T#1)中声明的数字
T#2扩展了类GenUpperBound中声明的对象
1错误

您必须像

class GenUpperBound<T extends Number>
类绑定

因为否则,您的
obj
可能是String类型,并且您不能为字符串分配数字。

您必须像

class GenUpperBound<T extends Number>
类绑定
因为在其他情况下,您的
obj
可能是String类型,并且您无法为字符串分配数字。

请尝试以下操作:

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);
   }
}
类绑定
{
T-obj;
公共无效集(T obj)
{
obj=obj;
}
公共静态void main(字符串…q)
{
GenUpperBound w=新的GenUpperBound();
w、 组(10);
}
}
试试这个:

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);
   }
}
类绑定
{
T-obj;
公共无效集(T obj)
{
obj=obj;
}
公共静态void main(字符串…q)
{
GenUpperBound w=新的GenUpperBound();
w、 组(10);
}
}

构造函数作用域类型参数
隐藏类作用域类型参数
。这两个
T
不代表相同的类型

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

new GenUpperBound<String>(new Integer(1));
现在这种编译也很好,但是
T
U
显然代表了不同的类型


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

class GenUpperBound<T extends Number> {

   T obj;

   public void set(T obj) {
      this.obj=obj;
   }
...
}
类绑定{
T-obj;
公共无效集(T obj){
obj=obj;
}
...
}

现在没有第二个
t
类型参数,但是构造函数使用类范围的参数。在这种情况下,像
new GenUpperBound(新整数(1))这样的语句
将不会编译,因为该参数的类型与实例参数化时使用的参数的类型不同。

构造函数作用域类型参数
隐藏类作用域类型参数
。这两个
T
不代表相同的类型

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

new GenUpperBound<String>(new Integer(1));
现在这种编译也很好,但是
T
U
显然代表了不同的类型


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

class GenUpperBound<T extends Number> {

   T obj;

   public void set(T obj) {
      this.obj=obj;
   }
...
}
类绑定{
T-obj;
公共无效集(T obj){
obj=obj;
}
...
}
现在没有第二个
t
类型参数,但是构造函数使用类范围的参数。在这种情况下,像
new GenUpperBound(新整数(1))这样的语句
将不会编译,因为参数的类型与实例参数化时使用的类型不同