2016-09-07 2 views
0

Я только начал изучать Generic.Here Я пытаюсь установить значение глобального obj в значение локального obj. Но я получаю ошибку преобразования типа. В чем причина этой ошибки?Ошибка преобразования типа в Generic

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 

ответ

4

Конструктор-Scoped типа параметра <T extends Number>скрывает класс-Scoped тип-параметр <T>. Эти два T не представляют тот же тип.

Именно поэтому компилятор отказывается компилировать ваш код, потому что аргумент в конструкторе может быть потенциально другого типа, чем тип, с помощью которого этот параметр параметризуется. Например:

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

Разница может быть ясно увидеть, если вы измените имя конструктору-Scoped Type-параметры для 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));, не будут компилироваться, потому что аргумент не того же типа, что и аргумент, с которым параметрируется экземпляр.

0

Вы должны объявить свой класс как

class GenUpperBound<T extends Number> 

, потому что в противном случае ваш obj может быть, например, типа String, и вы можете 't присваивать номер строке.

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); 
    } 
} 
Смежные вопросы