簡體   English   中英

從類文件實例化通用參數化類型

[英]Instantiating Generic Parameterized Type from class file

因此,客戶端將以以下方式創建類:

public class Tester implements Test<Type1, Type2, Type3> {
    @override
    public method1(...)
    ...
}

然后,客戶端會將.class文件(IE Tester.class)傳遞給我們。

然后,我們想實例化客戶端的類,並根據泛型使用的類型運行其method1。 到目前為止,我有以下代碼,但我認為我沒有走正確的道路:

    //tempClass = <ClassName>.class
    Type[] genericTypes;
    Type[] genericInterfaces = tempClass.getGenericInterfaces();
    if(genericInterfaces[0] instanceof ParameterizedType){
        genericTypes = ((ParameterizedType)genericInterfaces[0])
                        .getActualTypeArguments();
    }
    Class<Tester<genericTypes[0], genericTypes[1], genericTypes[2]>> classTest
        = ( Class<Tester<genericTypes[0], genericTypes[1], genericTypes[2]>>) tempClass
    Constuctor<...> = ... //get the constructor
    //Create the new instance by calling .newInstance()

但是eclipse在Class>行中給了我很多錯誤,所以我認為這不是正確的方法。 我究竟做錯了什么?

Tere這里有幾個問題...

首先,這兩個Classname.class本質上都是靜態構造-甚至都稱為文字 因此,無法在運行時提供類型名稱,這就是Eclipse抱怨您嘗試這樣做的原因。 要獲得以類名作為字符串的Class對象,可以使用Class.forName

Class<?> tempClass = Class.forName("Tester");

(全限定名,沒有.class后綴)。

其次, Tester<Type1, Type2, Type3> 在編譯時必須知道類型實參。 現在,我不確定為什么在這個地方需要這個演員表,但是我看到了兩個可能的原因:

  • 為了確保由tempClass表示的類確實實現了適當的接口,那么即使它在語法上是合法的,也沒有用。 強制轉換無法動態檢查泛型類型參數,因為它們也完全是編譯時構造的-由於類型擦除 ,它們在運行時不可用。 要檢查給定的Class對象A是否是Class對象B表示的類型的子類/實現,我們可以使用Class.isAssignableFrom

     if (B.isAssignableFrom(A)) { // ... } 
  • 為了避免警告-對不起,這種類型轉換真的是不加以控制,因為沒有辦法,以確保它的正確性在運行時-再次,由於輸入erasuer。 在您知道@SuppressWarnings有效且Java類型系統太笨而無法驗證您的聲明的地方使用@SuppressWarnings

無論如何,不​​要上課。 相反, newInstance調用的結果。 現在,關於運行正確的方法...現在,您將獲得所需的所有信息,分為兩部分:調用方法的對象和已實現接口的參數類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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