2012-05-12 89 views
3

請詳細解釋Java通用類的以下兩個版本之間的區別(如果有的話)?Java通用類中的void foo(T y)和<T> void foo(T y)之間的區別

class C<T>{ 
    T x; 
    void foo(T y) { … } 
} 

class C<T>{ 
    T x; 
    <T> void foo(T y) { … } 
} 

而另一個問題:請問在FOO()的身體被寫入,取代「......」這會導致Java編譯器接受C的第一版本,但拒絕第二版的C.

我很困惑。

回答

10
class C<T>{ 
    T x; 
    <T> void foo(T y) { … } 
} 

是寫

class C<T>{ 
    T x; 
    <S> void foo(S y) { … } 
} 

至於什麼會拒絕第二個版本,例如這是一個令人困惑的方式:

class C<T>{ 
    T x; 
    <T> void foo(T y) { x = y; } 
} 

會失敗,因爲如果你把它改寫爲

class C<T>{ 
    T x; 
    <S> void foo(S y) { x = y; } 
} 

你可以馬上s即你缺少演員(確切的編譯器錯誤是「不兼容的類型」)。

+0

非常有幫助。謝謝! – eleven

2

在第一個示例中,方法foo中的T類型變量表示與類定義C<T>中聲明的類型相同的類型。

第二個例子是一個陷阱,因爲方法聲明中的T是與類的類型參數無關的完全不同的類型,它恰好具有相同的名稱T。與局部變量隱藏相同名稱的字段的情況類似。

的Eclipse發出一個漂亮的編譯器警告(如果此警告在設置中打開,不知道這是否是默認的)這種情況:

類型參數T隱藏着T型

+0

非常有幫助,謝謝! – eleven

相關問題