Следующий код:
Set<? extends Integer> set = new HashSet<>();
Компилируется нормально. Однако суть использования ромбовидной нотации как раз в том, чтобы не переписывать снова параметр типа LHS. Это означает, что приведенное выше утверждение должно быть эквивалентно следующему:
Set<? extends Integer> set = new HashSet<? extends Integer>();
Но, как оказалось, это не так. Я думаю, это рационально, поскольку компилятор не знает параметр типа объекта, так как это подстановочный знак ('?'). Когда не используются параметры ограниченного типа, все работает нормально, поэтому я предположил, что то же самое будет применяться в любом случае. Но зачем вообще разрешать синтаксис? Что, в конце концов, является параметром типа первого оператора?
Спасибо