2012-07-25 156 views
2

我收到一個錯誤,我有這樣的結構在我的計劃Java泛型擴展類參數

public interface Shapes<T>{ 
//methods here 
} 

public class ShapeAction<T> implements Shapes<T>{ 
//Methods and implementations here 
} 

public class Circle extends ShapeAction<T>{ 
//Some methods here 
} 

誤差以類圓形指着延伸形狀< 牛逼>它說:「T不能被解析爲一種」。如果我將T設置爲字符串,錯誤將消失,但這也意味着我只能使用一種數據類型。我應該把什麼放在<>以便我可以使用任何數據類型(String,int,double等)還是我以錯誤的方式做到這一點?

+0

請發佈錯誤。 – 2012-07-25 17:30:09

+0

你在Shapes和ShapeAction中使用T? – Andrew 2012-07-25 17:32:34

回答

6

有兩個不同的概念。當你寫

public class ShapeAction<T> 

這意味着你正在創建一個類,當它被實例化時,將用一些類參數化。你不知道它會是什麼時候,所以你把它稱爲T

但是,當你寫

public class Circle extends ShapeAction<T> 

,這意味着你要Circle要與T類型參數化的ShapeAction一個子類。但什麼是T?編譯器無法說明:您聲明瞭Circle而沒有任何類型變量。

您有兩種選擇。您可以圈通用太:

public class Circle<T> extends ShapeAction<T> 

這樣,當你讓你指定它的工作原理是什麼類型與Circle一個新實例,這延伸到超類。

如果你想指定ShapeAction可以是任何類型,但沒有使子類通用?使用Object

public class Circle extends ShapeAction<Object> 

這樣Circle保持非通用的,但你可以使用任何數據類型與超類。

+0

感謝馬爾科姆你給出了一個清晰的解釋。 – dimas 2012-07-25 17:50:10

+0

很好的解釋! – Chaz32621 2012-09-29 01:47:28

4

你試過嗎?

public class Circle<T> extends ShapeAction<T>{ 
//Some methods here 
} 

沒有辦法編譯器可以告訴什麼T論點extends ShapeAction<T>意味着,除非你先定義它。

最終,當您使用參照Circle,你將不得不提供T一種說法,這將是級聯到這種類型的所有其他出場。

Circle<Integer> myInt; 

將導致編譯代碼的含義爲:

public class Circle<Integer> extends ShapeAction<Integer>{ 
    //Some methods here 
} 

等,爲類層次結構的其餘部分。

因此,如果您未在類Circle中定義類型T。編譯器沒有辦法告訴ShapeAction的參數化類型,這很可能是這裏問題的根源。

+0

謝謝你的工作,但我只想問爲什麼我需要在Circle類中定義另一個?我以爲Circle類已​​經擴展了ShapeAction,它有這個? – dimas 2012-07-25 17:39:45

+0

@dimas它不會這樣工作,參數化類型不像您似乎暗示的那樣繼承。 – 2012-07-25 17:41:21

+1

非常感謝! – dimas 2012-07-25 17:51:02

1

你真的沒有告訴我們足夠的代碼來告訴你想達到什麼樣的,但一般:

如果你想,可以接受多種類型的參數的方法,你要參數方法,不是整個班級。

public <T> Shape takeAction(T argument); 

顯然,這並沒有真正提供多少編譯時類型安全,你可能仍然需要手動解決的說法在運行時限制類型的某個子集。

+0

嗨,感謝您的回答,我只是試圖用泛型和多態。但是我在這兩個類中插入的方法並不多,並且包含界面。我只是想檢查是否可以使用類型爲的ShapeAction擴展Class Circle的功能。我認爲,如果我這樣做,我可以使用ShapeAction中的方法,其類型爲,我可以在其中顯式聲明它們應該在Circle類中應該是什麼類型。 – dimas 2012-07-25 17:45:36