Оператор Java 7 diamond: почему это было сложно реализовать? - PullRequest
16 голосов
/ 01 марта 2012

Я наблюдал за виртуальным событием Oracle OTN: Java SE и JavaFX 2.0 (28 февраля 2012 г.) и, говоря о новом операторе с бриллиантами (об этом Map<String, List<String>> myMap = new HashMap<>();), докладчик упомянул, что его реализация не так проста, как можно подумать, так как это не простая замена токена.

Мой вопрос, почему?Почему это не может быть реализовано так, чтобы просто взять строку из объявления переменной и поместить ее в оператор diamond?

Ответы [ 2 ]

14 голосов
/ 01 марта 2012

Я тоже не реализовал это, поэтому я могу только догадываться.

Но обычно причина, по которой эти вещи более сложны, чем кажутся, заключается в том, что при первой проверке рассматриваются только самыеобщий (или наиболее разрекламированный) вариант использования.В данном случае это тот, который вы упомянули.Теоретически это должно быть легко точно указано, и это должно быть довольно легко реализовать в компиляторе.

Однако оператор Diamond (кстати, технически не является оператором) может использоваться по-разному.а также:

someMethodWithGenericArguments(new HashMap<>());
new SomeGenericClass(new HashMap<>());
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter

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

2 голосов
/ 01 марта 2012

То, что Java не делает (что есть во многих языках) - это подразумеваемые типы, основанные на использовании.т. е. Java не подразумевает требуемый тип в зависимости от того, как он используется.

например,

 Type a = b;

Тип a и тип b независимы и не предполагаютсделаны около b на основе типа a.

MethodHandles демонстрируют признаки поддержки этого.Использование возвращаемого типа может быть основано на контексте, но это функция времени выполнения.

В заключение, я предполагаю, что;Это было трудно реализовать в Java, потому что язык не поддерживал ничего подобного.Если бы язык использовал такую ​​функцию постоянно, подход был бы понят (с точки зрения определения спецификации того, как он должен работать) и был бы поддержан инструментами в компиляторе.

...