[英]Java generics: What is the compiler's issue here? (“no unique maximal instance”)
我有以下方法:
public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
return fromJson( jsonData, (Type)clazz );
}
public <T> T fromJson( Reader jsonData, Type clazz ) {
...
}
編譯器說的是第一種方法:
type parameters of <T>T cannot be determined;
no unique maximal instance exists for type variable T
with upper bounds T,java.lang.Object
return fromJson( jsonData, (Type)clazz );
^
問題是什么?
問題是第二種方法的定義:
public <T> T fromJson( Reader jsonData, Type clazz ) {
編譯器無法確定T
可能具有的類型。 您必須在此處返回Object
,因為您無法使用Type<T> clazz
( Type
不支持泛型)。
這導致第一種方法中的強制轉換(T)
會引起警告。 要擺脫這種警告,您有兩種選擇:
告訴編譯器類型。 使用這個(奇數)語法:
this.<T>fromJson( jsonData, (Type)clazz );
請注意,這里需要this
,因為<T>fromJson()
本身就是非法語法。
使用注釋@SuppressWarnings("unchecked")
。
我遇到了同樣的問題,發現它是JDK中的一個錯誤( #6302954 )。 它被修復在jdk 6u25。
我解決了這個問題的一個實例,但決定更新CI盒子上的JDK版本。
這似乎是推理的失敗。 第一種方法顯然打算調用第二種方法,類型參數與它具有相同的類型參數T
但是編譯器可能無法解決這個問題,因為它的推理系統還不夠好。
在任何情況下,您應該能夠顯式指定類型參數,它應該擺脫錯誤:
public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
return this.<T>fromJson( jsonData, (Type)clazz );
}
我在NetBeans中編譯時也遇到了類似的問題。 我所要做的就是在設置>編譯> Java平台中將JDK版本從16位更改為32位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.