繁体   English   中英

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

[英]What does Java's Enum<?> mean and why isn't it compatible with Enum?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM