Java 枚举的继承、实现接口 及默认实现 的问题 - V2EX
chengfeng1992
V2EX    Java

Java 枚举的继承、实现接口 及默认实现 的问题

  •  
  •   chengfeng1992 Oct 31, 2018 8447 views
    This topic created in 2750 days ago, the information mentioned may be changed or developed.

    最近在封装一个第三方类库。

    其中要用到类库中提供了很多枚举,出于 不想暴漏类库要限制类库中某些枚举值的使用 的目的,故想到了 继承一遍枚举。

    又因为 java 的枚举类型是不支持继承的(至少我这的 jre 不支持),所以想到了 使用实现接口 来达到目的。


    • 首先,类库中的枚举:
    public enum P1Enum { A, B, C; } 
    public enum P2Enum { AA, BB, CC; } 
    • 然后,自己写的接口
    interface IParent<T> { T getParent(); } 
    • 再然后,子类实现接口
    public enum P1S1Enum implements IParent<P1Enum> { A, B; @Override public P1Enum getParent() { return P1Enum.valueOf(this.name()); } } 
    public enum P1S2Enum implements IParent<P1Enum> { B, C; @Override public P1Enum getParent() { return P1Enum.valueOf(this.name()); } } 
    public enum P2S1Enum implements IParent<P2Enum> { AA, CC; @Override public P2Enum getParent() { return P2Enum.valueOf(this.name()); } } 
    • 这样做,确实可以实现目的

    然后问题来了,

    • 1.每一个枚举都需要 @Override getParent(), 是否可以通过接口默认实现来解决呢

    以下这一段代码不正确,因为我不会写了,当然问题就在这里。

    interface IParent<T extends Enum<T>> { default T getParent() { return T.valueOf(null, "A"); } } 
    • 2.有没有更好的实现方式呢

    先谢答。么么哒~

    3 replies    2018-11-05 11:20:50 +08:00
    SoloCompany
        1
    SoloCompany  
       Oct 31, 2018
    理论上可以,只能通过反射
    因为 java 虽然是类型擦除的,但 implements / extends 把模板变量固化了
    可以通过反射获取到模板类,再使用 Enum.valueOf(type, name)
    SoloCompany
        2
    SoloCompany  
       Oct 31, 2018
    ParameterizedType t = (ParameterizedType) P1S1Enum.class.getGenericInterfaes()[0];
    assert t.getActualTypeArguments()[0] == P1Enum.class;
    zsh1995
        3
    zsh1995  
       Nov 5, 2018
    interface IParent<T extends Enum<T>> {

    String name();

    default T getParent(){
    Class<T> rawType = (Class <T>) ((ParameterizedType) getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
    return T.valueOf(rawType, this.name());
    }
    }
    酱紫?
    About     Help     Advertise     Blog     API     FAQ     Solana     3037 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 15:14 PVG 23:14 LAX 08:14 JFK 11:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86