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

标签 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> 兼容?它们对我来说看起来很相似。

最佳答案

因为一切某事的意思不同。

Comparable 相同。 ComparableComparable<Object> ,所以它必须可以与所有事物进行比较。 Comparable<?>说“我可以将它与某些东西进行比较,但我不知道是什么。

同样:Enum是“枚举一切”。而Enum<?>是“枚举我不知道的东西”。

这给我们带来了 List<Enum> 的差异至List<Enum<?>> 。第一个可以包含或采用任意类型的枚举。对于后者,所有元素必须一致。

我强烈建议不要这样做。泛型是避免编程错误的强大工具。它们让您的生活更轻松。因此,了解它们,并利用它们为您带来优势。所以在这里,您应该使用 List<Shapes>List<Colors> .

关于java - Java 的 Enum<?> 是什么意思?为什么它与 Enum 不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513579/

相关文章:

c++ - 实现类型删除列表以实现快速写入/读取

斯卡拉 - Option.getOrElse() "type erasure"?

java - 在 Spring Boot 中,为什么我没有将一个服务类的返回值返回到另一个服务类

java - _programmatically_ 为 https urlconnections 找到所有支持的密码

java - 在 JComboBox 中显示属性并注册另一个属性

java - MapReduce/Hadoop 入门

c++ - 编译错误 - 类中的枚举

c# - 枚举作为标志使用、设置和移动

java - 用于搜索小写枚举常量的正则表达式

java - Java 中的类型删除和重载 : Why does this work?