2016-09-07 70 views
0

我剛剛開始學習關於Generic.Here我試圖設置全局obj的值爲本地obj的值。但我得到了類型轉換error.What是這個錯誤的原因是什麼?類型轉換錯誤通用

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

構造作用域型參數<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));這樣的語句將不會編譯,因爲參數的類型與實例參數化的參數不同。

0

您必須聲明你的類像

class GenUpperBound<T extends Number> 

,否則你obj例如可能是String類型的,你可以不要將數字分配給字符串。

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); 
    } 
}