Подтвердить что ты не робот

Оператор алмазов на Java 7: почему его было сложно реализовать?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

например.

 Type a = b;

Тип a и тип b независимы, и предположения о b не основаны на типе a.

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

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