Java的Enum <! - ? - >是什么意思,为什么它与Enum不兼容?

时间:2011-12-15 00:18:06

标签: java enums type-erasure

我正在重构其他人的代码,他们在几个地方使用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 个答案:

答案 0 :(得分:1)

因为所有内容某事的内容不同。

Comparable相同。 ComparableComparable<Object>,因此必须与所有内容相媲美。 Comparable<?>说“有些东西我可以比较,但我不知道是什么。

同样在这里:Enum是“一切的枚举”。而Enum<?>是“我不知道的事物的枚举”。

这使我们看到List<Enum>List<Enum<?>>的区别。第一个可以包含或采用任意类型的枚举。对于后者,所有元素都必须达成一致。

我强烈反对。泛型是一种避免编程错误的强大工具。它们让您的生活更轻松。所以要理解它们,并将它们用于您的优势。所以在这里,您应该使用List<Shapes>List<Colors>