Сегодня я наткнулся на эту ошибку, и я не совсем понимаю, в чем проблема.
У меня простой интерфейс
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(){}>
? Я не знаком с этим синтаксисом.
Это было частью улучшения функции вывода типов в Java 8, где она работает. В Java 8 аргумент типа может быть выведен из контекста, в котором используется выражение. Здесь он используется в выражении ImmutableSet<MyInterface>
переменной ImmutableSet<MyInterface>
.
Это было неверно в Java 7.
В Java 7 вы можете сделать
ImmutableSet<MyInterface> a = ImmutableSet.<MyInterface>of(new MyInterface() {
});
для явного задания аргумента типа.
<? implements MyInterface>
. (ТОЧНО СКАЗАТЬ НЕ МОГУ). :-)