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