Generic中的类型转换错误

时间:2016-09-07 10:22:17

标签: java generics

我刚刚开始学习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

3 个答案:

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

   ...
}

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

您可以使用以下方法解决此问题:

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类型,而您无法为字符串分配数字。