Я тоже не реализовал это, поэтому я могу только догадываться.
Но обычно причина, по которой эти вещи более сложны, чем кажутся, заключается в том, что при первой проверке рассматриваются только самыеобщий (или наиболее разрекламированный) вариант использования.В данном случае это тот, который вы упомянули.Теоретически это должно быть легко точно указано, и это должно быть довольно легко реализовать в компиляторе.
Однако оператор Diamond (кстати, технически не является оператором) может использоваться по-разному.а также:
someMethodWithGenericArguments(new HashMap<>());
new SomeGenericClass(new HashMap<>());
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter
В этих случаях простая замена токена, очевидно, больше не работает, вам необходим фактический вывод типа, включающий анализ реального типа (т. е. он находится на совершенно ином уровне абстракции, как простая замена токена).