2011-01-22 74 views
3

我有兩個類:如何使用泛型類中的類的對象作爲參數? - 泛型和反射結合

public abstract class MyAbstractSuperClass<A, B> { 

    public MyAbstractSuperClass(Class<A> a, Class<B> b) { 
     ... 
    } 

    ... 
} 

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass<A>> { 

    public MyClass(Class<A> a) { 
    super(a, MyOtherClass.class)); 
      ... 
    } 

    ... 
} 

現在你看,子類必須調用父類的構造函數。在這條線,我得到以下錯誤:

The constructor MySuperClass<A, MyOtherClass<A>>(Class<A>, Class<MyOtherClass>) is undefined 
  • 那麼,如何讓Class<MyOtherClass<A>>類型的對象?
  • 如何在超級構造函數調用中執行此操作,但執行不了多少?

在此先感謝。

+0

錯誤消息中沒有引用類MySuperClass。這個錯誤應該是這樣的:`構造函數MyAbstractSuperClass <...` – 2011-01-22 01:38:29

回答

-1

您必須在第二個參數添加到MyClass構造:

public MyClass(Class<A> a, Class<MyOtherClass<A>> bClass) { 
    super(a, bclass)); 
} 

@Bert F:這不「踢皮球」在某種意義上,但它推卸責任的人誰可以真正提供一個類適當類型的文字。調用者知道類型變量A的實際值,因此可以提供正確類型的類文字。由於擦除,MyClass不能這樣做。

+1

這不就是爲了達到目的嗎?試圖實例化MyClass的代碼現在是否具有與MyClass一樣的問題 - 它不能創建具體參數化類型的類字面值? – 2011-01-22 04:27:03

0

刪除MyClass定義中的MyOtherClass的類型參數。您顯然對MyClass'body的任何地方都不感興趣。

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass> { 
    public MyClass(Class<A> a) { 
     super(a, MyOtherClass.class); 
    } 
} 

如果警告困擾您,請添加@SuppressWarnings("rawtypes")

1

構造函數期待Class<MyOtherClass<A>>而不是Class<MyOtherClass>。我能想到的,以滿足編譯器的唯一方法是通過一個醜陋的系列鑄件:

@SuppressWarnings("unchecked") 
public MyClass(Class<A> a) { 
    super(a, (Class<MyOtherClass<A>>)(Class<?>)MyOtherClass.class); 
} 

它是類型安全通過檢查看到,因爲類文字的原始類型MyOtherClass相同的參數MyOtherClass<A>。但是這並不能阻止未經檢查的警告產生,這可以像上面那樣被抑制,或者簡單地忽略。