2014-03-04 42 views
2

剛見面這段代碼:通用混淆:泛型超類中的類型在編譯時沒有定義?

public class Container <T extends Containter<T>> { 
    protected Map<String, Rule> inspect (T t) { 
     // .... 
    } 
    public boolean isValid() { 
     // ... 
     inspect ((T)this); 
     // ... 
    } 
} 

我感到困惑的是「的isValid」 - 方法。

當用inspect(this);替換行也不會編譯:不兼容的類型:容器<Ť>不能轉換到T.

在不會發生錯誤的子類。所以我在問自己:this是否屬於Container以外的其他類型?我的意思是在上面的代碼中this的類型是什麼?明確的演員似乎是不必要的。

希望你們能理解我,我覺得很難用英文來解釋那些東西。

謝謝!

UPDATE

首先,感謝你並讓你等待遺憾。

對於檢查方法的意圖存在混淆。它應該在Container上工作(而不是在泛型類型上)。基本上只有Container的子類應該可以使用它。所以整個事情就是關於繼承。

這是關於使用檢查方法的子類的類型安全性。

想象(Container的檢查法內)像一個實例:現在

List<T> listOfSimilarContainers = new LinkedList<T>(); 

,如果有喜歡

public class SubContainer extends Container<SubContainer> { } 

一個子上該類應該強制listOfSimilarContainers調用檢查檢查方法內只包含SubContainers。

這就是我想達到的。

+0

這是指容器,其中爲'T'所指的內容是我的猜測。你會想檢查容器,或檢查容器的一個元素。如果你檢查容器本身,它不是'T'類型,就是'Container'類型。你會想說:'檢查(Container t)',然後調用它:'inspect(this);' – Fallenreaper

回答

4

下面是一個簡化版本:

interface Foo<T extends Foo<T>> { } 
class Bar implements Foo<Bar> { } 
class Baz implements Foo<Bar> { } 

注意,從Foo<Baz>Foo<Bar>而不是Baz繼承。代碼編譯沒有任何錯誤。

換句話說,界面的聲明並不保證,即TFoo<T>的子類。

+0

是的,我正在尋找這種保證不存在的情況。 –

0

應該如何檢查工作方法?如果要檢查泛型類型,那麼T可能是一個Class<T>對象,否則檢查的簽名sholud是:

public class Container<T extends Container<T>> { 
     protected Map<String, String> inspect(Container<T> t) { 
     } 
     public boolean isValid() { 
      // ... 
      inspect(this); 
      // ... 
     } 
    } 
+0

不,'T t'不能接受'Class '對象。 –

+0

爲什麼不能@Sotirios Delimanolis?我不知道檢查方法的目的。但無論如何你可以這樣做: 'Class clazz; protected Map inspect(Class t){...}; public boolean isValid(){ // ... inspect(clazz); }' – Ezequiel

+0

如果方法被聲明爲接受參數'T t',那麼'T'不能是'Class',因爲'T'具有'Container '的邊界。 –