我正在重构别人的代码,他们使用类型 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>
.
关于java - Java 的 Enum<?> 是什么意思?为什么它与 Enum 不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513579/