我有一个超类型定义为:
public abstract class AType<T> {
....
private T value;
private T mask;
public T getValue() {
if (isMasking())
return null;
return this.value;
}
public void setValue(T value) {
if (value == null)
throw new IllegalArgumentException("Value is mandatory.");
this.value = value;
}
protected T getMask() {
if (!isMasking())
return null;
return this.mask;
}
protected void setMask(T mask) {
if (mask == null)
throw new IllegalArgumentException("Mask is mandatory.");
this.setMasking(true);
this.mask = mask;
}
...
}
和几个子类型,如:
public class SpecType extends AType<Integer> {
...
}
这些子类型指定了未知参数....我有更多的 fe IPv4、Long 等
现在我需要在运行时以某种方式进行动态转换......我在枚举中定义了这些类,如下所示:
public enum Type {
SOME_TYPE(new TypeID(0, (short) 0), OFMU16.class,
new Instantiable<AType<?>>() {
@Override
public SpecType instantiate() {
return new SpecType(new OFMatchTypeIdentifier(0, (short) 0));
}
}),...;
...
public Class<? extends AType<?>> toClass() {
return this.clazz;
}
...
}
我想做类似的事情:
AType<?> type = SOME_TYPE.newInstance(); //this works
SOME_TYPE.toClass().cast(type).setValue(10); //this don't work
所以我必须静态地做:
((SpecType) type).setValue(10);
一切都会好起来的,但是这个模块的用户不想每次都在枚举中查找并手动转换。这可能会出错并花费大量时间进行调试:/....
我的问题是如何重构它或如何定义继承结构以允许用户动态转换?是否可以?
编辑: 我正在解析来自网络的数据包。供应商类型标识符和值/掩码类型有很多不同的类型 - 这些字段对于每个这种组合都是常量,所以我将其定义为枚举常量。Fe 20 只有 TypeID 不同,但 VendorID 相同,都可以表示为 Integer,接下来的 10 个 VendorID 和 TypeID 不同,但都可以表示为 Short 等等。