簡體   English   中英

Java泛型:這里的編譯器問題是什么? (“沒有唯一的最大實例”)

[英]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> clazzType不支持泛型)。

這導致第一種方法中的強制轉換(T)會引起警告。 要擺脫這種警告,您有兩種選擇:

  1. 告訴編譯器類型。 使用這個(奇數)語法:

     this.<T>fromJson( jsonData, (Type)clazz ); 

    請注意,這里需要this ,因為<T>fromJson()本身就是非法語法。

  2. 使用注釋@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.

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