Я думаю, что это возможно, но требует множества дополнений к спецификации языка, что неоправданно.
Во-первых, для примера enum вы можете использовать Class<? extends Enum<?>> options
.
В Class<? extends Enum> options
есть еще одна проблема: поскольку Enum.class
является Class<Enum>
, то есть Class<? extends Enum>
, допустимо options=Enum.class
Этого не может случиться с Class<? extends Enum<?>> options
, потому что Enum
не является подтипом Enum<?>
, что является довольно случайным фактом в беспорядочных обработках необработанных типов.
Вернемся к общей проблеме. Поскольку среди ограниченных типов атрибутов Class
является единственным с параметром типа, а подстановочный знак обычно достаточно выразителен, ваша проблема не стоит того, чтобы ее затрагивать.
Давайте обобщим проблему еще больше, предположим, что есть больше типов атрибутов, и во многих случаях подстановочный знак недостаточно силен. Например, допустим, что Map
разрешено, например,
Map<String,Integer> options();
options={"a":1, "b":2} // suppose we have "map literal"
Предположим, мы хотим, чтобы тип attrbite был Map<x,x>
для любого типа x
. Это нельзя выразить с помощью подстановочных знаков - Map<?,?>
означает скорее Map<x,y>
для любого x,y
.
Один из подходов - разрешить параметры типа для типа: <X>Map<X,X>
. Это на самом деле довольно полезно в целом. Но это серьезное изменение в системе типов.
Другой подход заключается в переинтерпретации параметров типа для методов в типе аннотации.
<X> Map<X,X> options();
options={ "a":"a", "b":"b" } // infer X=String
это не работает вообще в текущем понимании параметров типа метода, правил вывода, правил наследования и т. Д. Нам нужно изменить / добавить много вещей, чтобы это работало.
При любом подходе проблема состоит в том, чтобы доставить X
процессорам аннотаций. Придется придумать какой-то дополнительный механизм для переноса аргументов типа с экземплярами.