簡體   English   中英

推理變量 T 具有與特定類不兼容的界限<t>和實例<t>用一種方法</t></t>

[英]Inference variable T has incompatible bounds with specific Class<T> and instance <T> in one method

我正在使用包含我想使用的方法的庫。 簡化的簽名如下所示:

final class ThirdPartyClass
{
    public static <T> void thirdPartyMethod(Class<T> clazz, T instance)
    {
        // does something
    }
}

thirdPartyMethod()內部,它期望T作為第一個參數,並將該特定類T實例作為第二個參數。

現在我有了這個簡單的抽象類,它正在調用該方法:

abstract class Parent<T extends Number>
{
    public Parent(T instance)
    {
        ThirdPartyClass.thirdPartyMethod(instance.getClass(), instance);
    }
}

我收到一個錯誤:

類 ThirdPartyClass 中的方法 thirdPartyMethod 不能應用於給定類型;
必需:java.lang.Class,T
發現:java.lang.Class<capture#1 of? 擴展 java.lang.Number>, T
原因:推理變量 T 具有不兼容的邊界
平等約束:捕獲#2? 擴展 java.lang.Number
下限:T

如何修改Parent類,使其符合thirdPartyMethod()的預期參數? 如果可能的話,加上解釋。

根據Object.getClass()的返回類型

實際結果類型是Class<? extends |X|> Class<? extends |X|>其中|X| 是調用 getClass 的表達式的靜態類型的擦除。

由於T擴展了Number ,結果類型將是Class<? extends Number> Class<? extends Number> ,即表示一個未知類型擴展Number T extends Number不匹配(即擴展Number特定類型將在運行時提供)。

我如何修改父類以使其符合 thirdPartyMethod() 的預期參數?

1.在構造函數中引入第二個類型為Class<T>的參數。

abstract class Parent<T extends Number> {
    public Parent(T instance, Class<T> tClass) {
        ThirdPartyClass.thirdPartyMethod(tClass, instance);
    }
}

2.執行鑄造(如評論中所述):

ThirdPartyClass.thirdPartyMethod((Class<T>) instance.getClass(), instance);

順便說一下,與其從構造函數調用方法(尤其是那些不是由您/您的同事開發和測試的方法),不如考慮引入一個工廠方法,該方法將根據方法調用的結果生成您的域對象。

暫無
暫無

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

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