2009-09-04 12 views
11

クラスをパラメータ化するときにデフォルトの型を指定できますか? 例:私はNONEまたはすべてのパラメータを指定しないする必要があり、私の実装でGenericを使用したJavaでのオプションのパラメータ設定

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class> { 
     // code 
    } 


// parametrized imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1, ClassThatExtendsPar2Class> { 
    // code 
} 

// non-parametrized imlementation class 
public class RealClass extends AbsClass { 
    // code 
} 

。 2番目のパラメータを次のようにする必要はありません。

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class : default Par2Class > { 
     // code 
    } 

// parametrized only mandatory imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1> { 
    // code 
} 

答えて

18

単純な答え:いいえ、javaはデフォルトのパラメータ化をサポートしていません。

1

これを行うには本当に良い理由はありません。通常、ジェネリック型のパラメータは、そのメソッドの引数がその型のパラメータを受け取るか返すため、指定します。指定されていない場合は、それらのメソッドの意味のある実装を実行しないことをお勧めしているようです。

とにかく、あなたの感知された問題を解決するには、指定したい気にしないタイプパラメータに "Object"を指定してください。または、抽象クラスを、型パラメータを1つしか持たない別の抽象クラスで拡張します(extends呼び出しの2番目の型パラメータとしてObjectを指定します)。

+1

これを行うには十分な理由があるのか​​もしれません。私の「オプションのパラメータ」(T2はPar2Classを拡張しているため)は、値オブジェクトとして使用されるクラスであり、他のクラスのロットでも拡張されています。 T2を指定しない場合は、ValueObjectのデフォルトメソッドを使用します。私が指定すれば、私は特定の方法が必要で、キャストする必要はありません。 私は継承の順序で別のクラスを導入しようと考えていましたが、オプションのパラメータ設定について興味がありました。ありがとう。 – davorp

+0

私は間違っているかもしれませんが、そのようなユースケースがあると思います。デフォートテンプレートタイプが許可されているC++では、それらは使用されます。 STL型のメモリアロケータのデフォルトバージョンを提供します。 – Rom1

+0

SwingWorkerの中間型パラメータは、結果パラメータと同じ場合によく使用されます。 –

0

さて、あなたのケースのための正しい解決策は、私の視点から

// parametrized only mandatory imlementation class 
public class RealClass<StillGeneric extends Par1Class> 
extends AbsClass<ClassThatExtendsPar1, StillGeneric> { 
    // code 
} 
+0

しかし、私はAbsClassから "パラメータ化された"メソッドが必要です。私がRealClassをパラメータ化すると、私の場合、それは使用されません。あるいは私は何かを誤って判断していますか? – davorp

関連する問題