Обобщения Java: в чем здесь проблема компилятора? («нет уникального максимального экземпляра») - PullRequest
10 голосов
/ 12 марта 2010

У меня есть следующие методы:

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 );
                ^

В чем проблема?

Ответы [ 4 ]

16 голосов
/ 12 марта 2010

Проблема в определении второго метода:

public <T> T fromJson( Reader jsonData, Type clazz ) {

Компилятор не может определить тип T. Вы должны вернуть Object здесь, потому что вы не можете использовать Type<T> clazz (Type не поддерживает генерики).

Это приводит к приведению (T) в первом методе, что вызовет предупреждение. Чтобы избавиться от этого предупреждения, у вас есть два варианта:

  1. Сообщите компилятору тип. Используйте этот (нечетный) синтаксис:

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

    Обратите внимание, что вам нужен this здесь, потому что только <T>fromJson() является недопустимым синтаксисом.

  2. Используйте аннотацию @SuppressWarnings("unchecked").

13 голосов
/ 10 октября 2012

Я столкнулся с той же проблемой и обнаружил, что это ошибка ( # 6302954 ) в JDK. Это было исправлено в JDK 6u25.

Я обошел один из примеров этой проблемы, но решил вместо этого обновить версию JDK в окне CI.

2 голосов
/ 11 октября 2012

Это похоже на провал вывода. Первый метод явно намеревается вызвать второй метод с аргументом типа, являющимся тем же параметром типа T, что и у него. Но, вероятно, компилятор не может понять это, потому что его система логических выводов недостаточно хороша.

В любом случае вы должны иметь возможность явно указать аргумент типа, и он должен избавиться от ошибки:

public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
    return this.<T>fromJson( jsonData, (Type)clazz );
}
1 голос
/ 21 января 2013

У меня тоже была похожая проблема при компиляции в NetBeans. Все, что мне нужно было сделать, это изменить версию JDK с 16-разрядной на 32-разрядную в меню «Настройки»> «Компиляция»> «Платформа Java».

...