私は Java 8 を使用しています。私の設計では、 や などの値パラメータをモデル化するいくつかの単純なクラスがありFloatParameterますEnumParameter<E>。GenericParameter<T>パラメータ名とそのデフォルト値を実装するこれらのクラスの共通のジェネリック スーパー クラス ( ) があります。サブクラスは、の場合の範囲など、サブクラスに固有の他の属性を実装しますFloatParameter。
さらに、特定のタイプに関係なく、パラメーターのタイプを操作したいと考えています。しかし、私はまだ、型が のサブ型であるという方法で型をバインドしたいと考えていますGenericParameter<T>。そのために、 などのメソッドを作成しましたprocess(Class<? extends GenericParameter<?>> paramType)。
ここで、問題は、型の変数に を割り当てるEnumParameter.class ことができないClass<? extends GenericParameter<?>>一方で、 を割り当てることがFloatParameter.class できないことです。
さらに、クラスのコードをリストして、より明確で再現性を高めます。
public class GenericParameter<T> {
protected String name;
protected T defaultValue;
}
public class FloatGenericParameter extends GenericParameter<Float> {
...
}
public class TypedGenericParameter<T> extends GenericParameter<T> {
...
}
Class<? extends GenericParameter<?>> fgpc = FloatGenericParameter.class; // ok
Class<? extends GenericParameter<?>> tgpc = TypedGenericParameter.class; // error: incompatible types: Class<TypedGenericParameter> cannot be converted to Class<? extends GenericParameter<?>>
Class<? extends GenericParameter> tgpc2 = TypedGenericParameter.class; // warning: [rawtypes] found raw type: GenericParameter
最後に、非ジェネリック基本クラスを使用する場合、問題はありません。
public class Parameter {
....
}
public class FloatParameter extends Parameter {
...
}
public class TypedParameter<T> extends Parameter {
...
}
Class<? extends Parameter> fpc = FloatParameter.class; // ok
Class<? extends Parameter> tpc = TypedParameter.class; // ok
何か提案はありますか?
回避策として使用することも、キャストを行うこともできますがprocess(Class<?> paramType)、コンパイラによる静的な型チェックを利用したかったのです。
編集:
パラメータの型ごとにGUIコンポーネントを生成するファクトリを登録する際にキャストを使いたいと考えています。コードは次のようになります。
addParameterComponentFactory(EnumParameter.class, new ParameterComponentFactory() { ... })
このような場合、コンパイラはコンパイル時に追加されたパラメーターの型をチェックします。また、コードはより自明になります。
編集2:
現在、提案されたアプローチを使用して、addParameterComponentFactoryメソッドの型パラメーターを導入しています。署名は次のようになります。
public static <P extends GenericParameter<?>> addParameterComponentFactory(Class<P> clazz, ParameterComponentFactory pcf)
この定義により、TypedParameter.class( EnumParameter.class- 型パラメーターも 1 つ) を指定することができ、静的な型チェックを取得できます。