我正在重构其他人的代码,他们在几个地方使用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>
不兼容?它们看起来和我一模一样。
答案 0 :(得分:1)
因为所有内容与某事的内容不同。
与Comparable
相同。 Comparable
为Comparable<Object>
,因此必须与所有内容相媲美。 Comparable<?>
说“有些东西我可以比较,但我不知道是什么。
同样在这里:Enum
是“一切的枚举”。而Enum<?>
是“我不知道的事物的枚举”。
这使我们看到List<Enum>
与List<Enum<?>>
的区别。第一个可以包含或采用任意类型的枚举。对于后者,所有元素都必须达成一致。
我强烈反对。泛型是一种避免编程错误的强大工具。它们让您的生活更轻松。所以要理解它们,并将它们用于您的优势。所以在这里,您应该使用List<Shapes>
和List<Colors>
。