最近在封装一个第三方类库。
其中要用到类库中提供了很多枚举,出于 不想暴漏类库 且 要限制类库中某些枚举值的使用 的目的,故想到了 继承一遍枚举。
又因为 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());
}
}
然后问题来了,
@Override getParent()
, 是否可以通过接口默认实现来解决呢?以下这一段代码不正确,因为我不会写了,当然问题就在这里。
interface IParent<T extends Enum<T>> {
default T getParent() {
return T.valueOf(null, "A");
}
}
先谢答。么么哒~
1
SoloCompany 2018-10-31 21:07:48 +08:00
理论上可以,只能通过反射
因为 java 虽然是类型擦除的,但 implements / extends 把模板变量固化了 可以通过反射获取到模板类,再使用 Enum.valueOf(type, name) |
2
SoloCompany 2018-10-31 21:42:41 +08:00
ParameterizedType t = (ParameterizedType) P1S1Enum.class.getGenericInterfaces()[0];
assert t.getActualTypeArguments()[0] == P1Enum.class; |