Почему я получаю связанную ошибку несоответствия при вызове 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 есть (либо сделав ваш метод универсальным или вашего класса).

Другие вопросы по тегам