2011-10-29 17 views
0

javaでジェネリッククラスを定義するには、同じ基本クラスを共有するカスタムデータ型を使用してインスタンス化する必要があります。実行時にデータ型をチェックせずに行うことは可能ですか?さらに、私は、データ型を提供せずにジェネリッククラスをインスタンス化することを禁止したいと思います。定義済みのデータ型のみをサポートするJavaジェネリック

編集: 私はC++ライブラリ用のJavaラッパーを作成しています。そのため、Javaクラスでは、C++データ型のラッパークラスのみをパラメータとして許可する必要があります。示唆したように私は、有界型パラメータを使用してみましたが、その後、私はまだこのようなオブジェクトをインスタンス化することができます

MyClass c = new MyClass(); 

これは基本的にコードです:あなたは他の人が作成について心配している場合は

public class MyClass<T extends MyType> 
{ 
    public MyClass() 
    { 

    } 

    public doSomething(MyOtherClass<T> other) 
    { 

    } 
} 
+0

下記の回答を見ると、私はこの質問がちょっとした精緻化や例を使うことができると思います。 –

+0

これはジェネリックの質問ではなく、継承と多型に関連しています。これらの概念を見て、Javaでどのように動作するかを調べます。 –

+0

public myAddition(ピザa、ピザb){ \t \t int temp = 0; \t \t temp = a + b; <エラー - ********* \t \t System.out。println( "加算値は" + temp)です。 \t} \t \tパブリック静的無効メイン(文字列[] args){ \t \t DDHGenericのTEMP =新しいDDHGeneric()。 \t \t temp.myAddition(new Integer(5)、4); \t} データ型が事前にわからなくても加算演算子を使用できる方法はありますか。この追加で整数を追加できるようにしたいので、+演算子でエラーが発生します。 –

答えて

2

何がBounded Type Parametersと呼ばれて探している:

あなたは型パラメータに渡すことが許可されているタイプの種類を制限したいと思うがあるかもしれません。たとえば、数値で動作するメソッドは、Numberまたはそのサブクラスのインスタンスを受け入れるだけの場合があります。これは、有界型パラメータのためのものです。

public <U extends Number> void inspect(U u){ 
    System.out.println("T: " + t.getClass().getName()); 
    System.out.println("U: " + u.getClass().getName()); 
} 
1

独自の基本クラスのサブクラスを使用し、これを汎用型で使用すると、これを禁止できる唯一の方法は、基本クラスの拡張を制御することです。

1つの方法は、デフォルトの可視性を使用して基本クラスのコンストラクタを保護し、具体的な実装を同じクラスに配置することです。具体的な実装を最終的にするか、コンストラクタを非公開にします。

2

により型消去に - と下位互換性のために、今、非常に古い要件 - に方法はありませんクラスがジェネリック型パラメータによってインスタンス化されているが必要です。 2つのソリューション:

  1. 注意してください。
  2. ジェネリッククラスを拡張し、型パラメータを提供するクラスを介したアクセスのみを許可します。実行時例外の怒りを感じない開発者に:-)たとえば、class MyClassFoo extends MyClass<Foo>とし、MyClassのコンストラクタを外部コードから隠します。

いずれも理想的ではありませんが、それはそのとおりです。 C++と.NETの両方が異なって動作しますが、C++/.NETではなくJavaです:-)

ハッピーコーディング。

関連する問題