声明变量为Enum <enumtype>和EnumType </enumtype>之间的区别

时间:2014-08-04 08:15:12

标签: java enums

我从java.sql.SQLException: Data truncated for column 'gender' at row 1 for enum获得了灵感 我有这个枚举

public enum MyEnum {
  Value1,
  Value2;
}

以及此示例代码:

MyEnum raw = MyEnum.Value1;
Enum<MyEnum> wrapped = MyEnum.Value1;
  1. System.out.println(raw);
  2. System.out.println(wrapped);
  3. System.out.println(raw.getDeclaringClass());
  4. System.out.println(wrapped.getDeclaringClass());
  5. System.out.println(Arrays.toString(raw.values()));
  6. System.out.println(wrapped.values());
  7. System.out.println(raw.equals(wrapped));
  8. System.out.println(wrapped.equals(raw));
    • 要点1-2,3-4 :返回相同的结果
    • 第5点:返回[Value1,Value2](但应以静态方式访问才能正确)
    • 第6点:编译错误:未定义类型Enum<MyEnum>。为了使其有效,我将演员阵容设为System.out.println(((MyEnum) wrapped).values());
    • 第7点:返回true
    • 第8点:返回true

    另外,使用调试器检查,变量共享是相同的对象(相同的对象ID) 两种声明之间有哪些区别?

2 个答案:

答案 0 :(得分:2)

区别很简单:它与

之间的区别相同
String foo="bla";

Object foo="bla";

Enum<MyEnum>MyEnum的超类。因此,在使用超类时,已经在超类中定义的方法可用,但是在没有类型转换的情况下,特定子类中定义的方法不可用。在调用已在特定enum类中重写的实例方法时,将调用子类方法,与Java一样。

使用Enum<MyEnum>没有多大意义。然而,使用E extends Enum<E>是通用代码使用的构造,能够处理任意enum s。与EnumMapEnumSet一样。

答案 1 :(得分:1)

  

两种声明之间的区别是什么?

MyEnum extends Enum<MyEnum>所以对象将完全相同,只有引用的类型不同。