2017-06-22 7 views
1

クラスの属性のタイプが一般的で実行時に決定されるという要件があります。したがって、私はクラス定義の下で考えました。Javaクラスの属性にジェネリックを使用する

オブジェクトを作成する前に、その型を知っています。だから私はどのようにインスタンス化するのだろうか。私は以下を試みたが、コンパイルエラーが出る。正しい方法はなんですか?

Object obj = getObjFromFactory() // obj can be type say A.class or B.class. I wish to get the class of obj and pass it to Generics 

Generics<obj.class> generics = new Generics<obj.class>(); 
+0

https://stackoverflow.com/documentation/java/92/generics/388/creating-a-generic-class#t=20170622092158177626 – JEY

+1

注:それはそれだけで?を使用する可能性がありますできない場合'_raw_型を作成します。これはジェネリックチェックが無効になることを意味します。また、型がクラスであるため、 'New Generics ()'となるので、 'Sample.class'を使う必要はありません。 – Thomas

+0

ここではXY問題があると思います。実行時にJavaの汎用クラスの型を決定することはできません。 Javaジェネリックはコンパイル時のコンストラクトです。実行時にはすべてのジェネリックが消去されます。したがって、コンテキストと、作業中の属性と、実行時に決定する必要のあることを私たちに伝える必要があります。おそらく、ジェネリック以外のものを選択する手助けをすることができます。 – RealSkeptic

答えて

1

のために実行時まで、あなたが明示的に名前を付けることはできませんが、あなたはタイプを知りませんが、あなたはタイプ - を使用することができますので、ヨーヨー上記のコードで

private <T> void myRutine(final Factory<T> factory) { 
    // ... 
    final T obj = factory.getObj(); 
    // ... 
    final Generics<T> generics = new Generics<>(); 
    // ... 
    generics.put(obj); 
    // ... 
} 

:あなたはそれが何であれ、同じタイプのメイク参照してくださいすることができ、コードの異なる部分のタイプを結びつけるためのパラメータあなたはそれができるTを決定するために、呼び出しコードを委任しています。 `ジェネリック医薬品のジェネリックこと

Factory<?> f = codeToCreateFactory(); 
myRutine(f); 
3
Generics<Sample> generics = new Generics<>(); 

参照:Oracle Java Tutorials - Generics

+0

正しい。あなたはJava 7の前にそれを追加したいかもしれません。それはダイヤモンド演算子がJava 7で導入されたので 'Generics generics = new Generics ();'にする必要があります。 –

+0

私は質問を更新しました。ジェネリックに渡すクラスを派生させる必要がある基本オブジェクトがある –

+0

'getObjFromFactory()'は[ジェネリックメソッド](https://docs.oracle.com/javase/tutorial/extra/)にする必要があります。ジェネリックス/ methods.html)。それで 'Generics generics = getObjFromFactory();'を実行することができます。型パラメータには '.class'が存在しないので、' .class'は使わないでください。また、コンパイル時に型が分からなければ、これはうまくいきません。 – Jesper

0

あなたは同じようにコレクションを持つよう

はこれを好きではないということ:

List<Integer.class> myVarList = ...; 

しかし

List<Integer> myVarList = ...; 

ので、あなたの場合

Generics<Sample> generics = new Generics<>(); 

以前のバージョンのJava

Generics<Sample> generics = new Generics<Sample>(); 
+0

私の質問が更新されましたか?ジェネリックスに渡すクラスを派生させる必要があるベースオブジェクトがあります。 –

関連する問題