Что делает Enum Javaзначит и почему он не совместим с Enum? - PullRequest
0 голосов
/ 15 декабря 2011

Я выполняю рефакторинг чужого кода, и они используют тип Enum<?> в нескольких местах. Было бы очень трудно избавиться от него, и похоже, что оно должно быть совместимо с неуниверсальным объявлением типа Java Enum, поскольку им обоим нечего сказать о параметре типа универсальному типу.

Я создал этот фрагмент кода, чтобы продемонстрировать проблему с ошибками компиляции, указанными в комментариях:

enum Shapes {   
  SQUARE,
  CIRCLE 
};

enum Colors {
    RED,
    BLUE,
    GREEN
  };
public void testEnumConversions() throws Exception {
  List<Enum<?>> colors = ImmutableList.<Enum<?>>of(Colors.RED, Colors.GREEN, Shapes.SQUARE);
  List<Enum> colors2 = 
      ImmutableList.<Enum<?>>of(Colors.RED, Colors.GREEN); // incompatible types
  List<Enum> colors3 = 
      (List<Enum>)ImmutableList.<Enum<?>>of(Colors.RED, Colors.GREEN); // inconvertible types
  List<Enum> colors4 = ImmutableList.<Enum>of(Colors.RED, Colors.GREEN, Shapes.SQUARE);
  List<Enum<?>> colors5 = ImmutableList.of(Colors.RED, Colors.GREEN, Shapes.SQUARE);
  List<Enum> colors6 = 
      ImmutableList.of(Colors.RED, Colors.GREEN, Shapes.SQUARE); // incompatible types;

}

Почему List<Enum<?>> не совместимо с List<Enum>? Они кажутся мне идентичными.

1 Ответ

1 голос
/ 15 декабря 2011

Потому что все не говорит то же самое, что что-то .

То же самое с Comparable.Comparable - это Comparable<Object>, поэтому оно должно быть сопоставимо со всем.Comparable<?> говорит: "есть кое-что, с чем я могу сравнить это, но я не знаю, с чем.

То же самое здесь: Enum" Перечисление всего ". Тогда как Enum<?>" Перечисление чего-либочто я не знаю ".

Это приводит нас к разнице от List<Enum> до List<Enum<?>>. Первое может содержать или принимать перечисления произвольного типа. Для последнего все элементы должны совпадать.

Я настоятельно рекомендую против любого из них. Обобщения являются мощным инструментом, позволяющим избежать ошибок программирования. Они облегчают вашу жизнь. Так что понимайте их и используйте их в своих интересах. Поэтому здесь вы должны использовать List<Shapes> и List<Colors>.

...