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

2018-10-31 18:40:25 +08:00
 chengfeng1992

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

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

又因为 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());
    }

}


然后问题来了,

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

interface IParent<T extends Enum<T>> {

    default T getParent() {
        return T.valueOf(null, "A");
    }

}

先谢答。么么哒~

7439 次点击
所在节点    Java
3 条回复
SoloCompany
2018-10-31 21:07:48 +08:00
理论上可以,只能通过反射
因为 java 虽然是类型擦除的,但 implements / extends 把模板变量固化了
可以通过反射获取到模板类,再使用 Enum.valueOf(type, name)
SoloCompany
2018-10-31 21:42:41 +08:00
ParameterizedType t = (ParameterizedType) P1S1Enum.class.getGenericInterfaces()[0];
assert t.getActualTypeArguments()[0] == P1Enum.class;
zsh1995
2018-11-05 11:20:50 +08:00
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());
}
}
酱紫?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/503133

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX