Enum<E extends Enum<E>>
参考:https://segmentfault.com/a/1190000038778953
不理解为什么Enum的泛型要写成<E extends Enum<E>>
,看了这篇解读就明白了。
简单地说就是:有一个基类CustomEnum
,两个子类Color
和WeekDay
。两个子类可以同类比较大小(同为Color
类型的实例之间比较,同为WeekDay
类型的实例之间比较),但不同类(Color
类型和WeekDay
类型)不应该能比较。
为了达成这个目的,所以基类写成了CustomEnum<E extends CustomEnum<E>>
。
-
基类CustomEnum
public abstract class CustomEnum<E extends CustomEnum<E>> implements Comparable<E> { protected final String name; protected final int ordinal; protected CustomEnum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } public final String name() { return name; } public final int ordinal() { return ordinal; } @Override public int compareTo(E o) { return ordinal - o.ordinal; } }
-
Color
public class Color extends CustomEnum<Color> { public Color(String name, int ordinal) { super(name, ordinal); } }
-
WeekDay
public class WeekDay extends CustomEnum<WeekDay> { public WeekDay(String name, int ordinal) { super(name, ordinal); } }
-
测试
public class ParamUpperBound { public static void main(String[] args) { Color red = new Color("red", 0); Color green = new Color("green", 1); WeekDay monday = new WeekDay("monday", 2); red.compareTo(green); monday.compareTo(red); } }
不过,我测试下来和参考文章有些出入。
我的基类写成CustomEnum<E extends CustomEnum>
时,已经能限制 不同类之间不同比较大小 了。