Компилируется следующий код Java:
interface Interface1{}
interface Interface2{}
class MyClass1<T extends Interface1 & Interface2>{}
Кроме того, компилируется следующий код:
class AClass{}
interface Interface3{}
class MyClass2<T extends AClass & Interface3>{}
Следующий код даст мне ошибку компиляции:
interface Interface4 {}
class MyClass3<T, S extends T & Interface4> {}
Таким образом, кажется, что невозможно иметь несколько границ, если один из ограничивающих типов сам является параметром типа. Но почему?
Насколько я понимаю, если объявлено несколько границ, максимум одна из них может быть классом (все остальные — интерфейсы), и она должна быть первой.
Но, поскольку в моем примере Interface
— это интерфейс, почему компилятор жалуется? В конце концов, не должно быть никакой разницы, является ли T интерфейсом или классом.
Я пытался найти ответ в Интернете, но, видимо, моих навыков гугления недостаточно. Я хотел бы понять, что здесь происходит.
Раздел 4.4 спецификации языка Java явно запрещает это. Тип Bound указывается как:
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
AdditionalBound:
& InterfaceType
Таким образом, похоже, что вы можете указать переменную типа ("T") или у вас может быть список классов и интерфейсов, но вы не можете их смешивать.
https://docs.oracle.com/javase/specs/jls/se18/html/jls-4.html#jls-4.4
Я понимаю, почему они это сделали, но эта функция была бы действительно мощной. Как можно сделать/запросить это изменение?