私は次のように定義された1つのスーパータイプを持っています:
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> {
...
}
これらのサブタイプは、不明なパラメータを指定します。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);
すべてがOKですが、このモジュールのユーザーは、列挙型を調べて毎回手動でキャストすることを望まないでしょう。これはおそらく間違いを犯し、デバッグに多くの時間を費やします:/...。
私の質問は、これをリファクタリングするにはどうすればよいですか、またはユーザーが動的にキャストできるように継承の構造を定義するにはどうすればよいですか?出来ますか?
編集: ネットワークからのパケットを解析しています。ベンダータイプ識別子と値/マスクのタイプが異なる多くのタイプがあります-これらのフィールドはすべてこの組み合わせに対して一定であるため、列挙型定数として定義しました。Fe 20はTypeIDのみが異なりますが、VendorIDは同じであり、すべて整数として表すことができます。次の10はVendorIDとTypeIDが異なりますが、Shortなどとして表すことができます。