Почему я получаю связанную ошибку несоответствия при вызове Enum.valueOf() с использованием подстановочного знака
Я пытаюсь позвонить Enum<E>
статический метод класса valueOf()
но я получил ошибку компиляции. Пожалуйста, посмотрите на фрагмент кода ниже.
public void hello(Class<? extends Enum<?>> q){
Object o= Enum.valueOf(q,"hello");
}
IntelliJ IDEA прекрасно выполняет следующий код, но Eclipse выдает ошибку компиляции:
1 ответ
Я не знаю, как работает IntelliJ, но я могу сказать вам причину, по которой он не компилируется.
Метод, определенный в классе Enum<T extends Enum<T>>
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
имеет первый аргумент, который является классом типа T
который определяется T extends Enum<T>
, То есть он расширяет тип перечисления тем же универсальным типом, что и сам.
Когда вы вызываете метод с первым аргументом как
Class<? extends Enum<?>>
Вы не указываете, что два ?
на самом деле того же типа, как требуется. Это выдает ошибку несоответствия.
То, что вы можете сделать с вашим методом, это сделать его общим:
public static <E extends Enum<?>> void hello(Class<E> q)
но, как вы можете себе представить, это все равно не будет компилироваться, потому что ?
не обязательно E
, Так что вам нужно разобрать это:
public static <E extends Enum<E>> void hello(Class<E> q)
и это скомпилируется.
Изменить: еще один способ думать об этом
Вы могли бы подумать об исправлении подписи вашего метода
public void hello(Class<? extends Enum<?>> q)
изменив его на
public void hello(Class<E extends Enum<E>> q)
просто чтобы указать, что два подстановочных знака одинаковы. Концепция верна, но синтаксис не легален. Вы должны определить, что E
есть (либо сделав ваш метод универсальным или вашего класса).