Ошибка компиляции: "'<>' не может использоваться с анонимными классами"

Я бы очень хотел написать это:

Lists.transform(vals,
    new Function<>() {
        public List<ValEntry> apply(Validator<? super T> input) {
            return input.validate(value);
        }
    });

... чем это:

Lists.transform(vals,
    new Function<Validator<? super T>, List<ValEntry>>() {
        public List<ValEntry> apply(Validator<? super T> input) {
            return input.validate( value );
        }
    });

Но компилятор Java дает мне следующее сообщение об ошибке:

'<>' cannot be used with anonymous classes

Есть ли фундаментальная причина для этого? Или просто пропустить эту функцию в JDK 7, может быть, они делают это в 8?

Ответы

Ответ 1

В соответствии с проектная документация по монетам:

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

ИЗМЕНИТЬ Так что это возможно в будущей версии. Это все еще невозможно с Java 8, но теперь у нас есть лямбды, поэтому там меньше необходимости.

Ответ 2

Теперь это планируется включить в Java 9. Из JEP 213: Монета проекта фрезерования:

  1. Разрешить алмаз с анонимными классами, если тип аргумента выводимого типа обозначается. Поскольку предполагаемый тип с использованием алмаза с конструктором анонимного класса может быть за пределами набора типов, поддерживаемых атрибутом подписи, использование алмаза с анонимными классами было запрещено в Java SE 7. Как отмечалось в предлагаемом окончательном проекте JSR 334, это будет можно облегчить это ограничение, если предполагаемый тип был обозначен.