[英]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
相同。 Comparable
是Comparable<Object>
,因此它必须与所有内容都具有可比性。 Comparable<?>
说:“我可以与之进行比较,但是我不知道是什么。
此处相同: Enum
是“所有内容的枚举”。 而Enum<?>
是“我不知道的事物的枚举”。
这将我们带到List<Enum>
与List<Enum<?>>
的区别。 第一个可以包含或采用任意类型的枚举。 对于后者,所有要素都必须达成一致。
我强烈建议不要这样做。 泛型是避免编程错误的强大工具。 它们使您的生活更轻松。 因此,请理解它们,并利用它们来发挥自己的优势。 所以在这里,您应该使用List<Shapes>
和List<Colors>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.