簡體   English   中英

將參數化的Class實例傳遞給構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM