[英]Passing parameterized Class instance to the constructor
我迷失在仿制葯的叢林中,請幫助我:)我有這樣的事情:
public class BaseClass<TYPE> {
public BaseClass(Class<TYPE> clazz) {};
}
public class FirstLevelClass<REFRESHABLE
extends RefreshableInterface> extends BaseClass<REFRESHABLE> {
public FirstLevelClass(Class<REFRESHABLE> clazz) {
super(clazz);
};
}
public class Argument<T extends AnyOtherClass>
implements RefreshableInterface {
public refresh() {}
}
pulbic class ProblematicClass
extends FirstLevelClass<Argument<AnyOtherClassDescendant>> {
public ProblematicClass() {
//Compiler error: Constructor
//FirstLevelClass<Argument<AnyOtherClassDescendant>>(Class<Argument>) is undefined
super(Argument.class);
}
}
據我所知,編譯器應該接受Argument
因為它實現了RefreshableInterface
。
ProblematicClass
工作? ps:如果你有更好的頭銜,請更改它。 我無法彌補更好。
問題是,您的構造函數需要Class<T>
,並且代碼中的T
被推斷為Argument<AnyOtherClassDescendant>
。
所以,你應該傳遞一個Class<Argument<AnyOtherClassDescendant>>
,然后傳遞Class<Argument>
。 但是你不能直接傳遞那個Class
實例,因為你不能做Argument<AnyOtherClassDescendant>.class
。
但是,您可以通過將類類型轉換為必需的實例來解決問題:
public ProblematicClass() {
super((Class<Argument<AnyOtherClassDescendant>>)(Class<?>)Argument.class);
}
注意,如何將Class<Argument>
首先類型Class<Argument<AnyOtherClassDescendant>>
Class<?>
,然后將結果類型類型Class<Argument<AnyOtherClassDescendant>>
。 沒有簡單的方法可以實現這一目標。
這背后的原因是,泛型類型的所有參數化實例化只有一個Class
實例,它與類本身相關聯。 泛型類型的單個編譯單元,僅編譯為單個類文件。 我想這與C ++實現模板的方式不同。 在那里,您可以獲得不同實例化的不同機器代碼。
所以,如果你執行下面的代碼,你會得到true
的輸出:
List<String> strList = new ArrayList<String>();
List<Integer> intList = new ArrayList<Integer>();
boolean isSameClassInstance = strList.getClass() == intList.getClass();
System.out.println(isSameClassInstance);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.