Несоответствие типов с использованием обобщений Java и анонимного класса

1

Сегодня я наткнулся на эту ошибку, и я не совсем понимаю, в чем проблема.

У меня простой интерфейс

public interface MyInterface
{
}

Затем я пытаюсь создать Guava ImmutableSet, используя метод of() передающий ему экземпляр анонимного класса.

ImmutableSet<MyInterface> a = ImmutableSet.of(new MyInterface()
{
});

Компилятору это не нравится:

Type mismatch: cannot convert from ImmutableSet<new MyInterface(){}> to ImmutableSet<MyInterface>

Каким типом является ImmutableSet<new MyInterface(){}>? Я не знаком с этим синтаксисом.

  • 0
    Попробуйте <? implements MyInterface> . (ТОЧНО СКАЗАТЬ НЕ МОГУ). :-)
  • 0
    возможный дубликат головоломки преобразования типов Java Generics
Показать ещё 1 комментарий
Теги:
generics
anonymous-class

1 ответ

3
Лучший ответ

Это было частью улучшения функции вывода типов в Java 8, где она работает. В Java 8 аргумент типа может быть выведен из контекста, в котором используется выражение. Здесь он используется в выражении ImmutableSet<MyInterface> переменной ImmutableSet<MyInterface>.

Это было неверно в Java 7.

В Java 7 вы можете сделать

ImmutableSet<MyInterface> a = ImmutableSet.<MyInterface>of(new MyInterface() {
});

для явного задания аргумента типа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню