Enum>

Enum<E extends Enum<E>>

参考:https://segmentfault.com/a/1190000038778953

不理解为什么Enum的泛型要写成<E extends Enum<E>>,看了这篇解读就明白了。


简单地说就是:有一个基类CustomEnum,两个子类ColorWeekDay。两个子类可以同类比较大小(同为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>时,已经能限制 不同类之间不同比较大小 了。

上一篇:枚举类 Enum 之初认识


下一篇:2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?