2011-07-01 9 views
1

私は汎用クラスAを持っていますが、私は与えられたオブジェクトであるクラスに基づいてAのインスタンスを作成する必要があります。つまり、私は持っています:クラス<?>変数を使用して汎用オブジェクトを作成する

public void (Object obj) { 
    Class<?> c = obj.getClass(); 
    A<c> = ...; 
} 

しかし、第三行目では、Eclipseはcは型に解決できないと言っています。ジェネリックパラメータを削除すると、「Aは生の型です。ジェネリック型Aへの参照をパラメータ化する必要があります。」

ここにはどのような正しい方法がありますか?

ありがとうございました。あなただけのクラスが必要な場合は

+0

オブジェクト参照に大文字の 'B'を使用すると、特にジェネリックを使用しているときに、Java開発者にとって大変混乱します。 'obj'が良いでしょう。 – artbristol

+0

大文字(CamelCaseなど)で始まる@artbristolが述べたことを詳述すると、クラスが示されます。小文字(例:camelCase)で始まる変数は変数を表します。 'c'は型ではなく、' c'は 'Class '型のオブジェクトです。下のTalhaはこれに関する答えを持っています。 – Atreys

+0

情報ありがとうございます。質問を修正しました。 – tsiki

答えて

2
public <C> void (Object B) { 
    Class<C> c = B.getClass(); 
    A<C> a = ...; 
} 

またはより良いは

public <C> void (C B) { 
    Class<C> c = B.getClass(); 
    A<C> a = ...; 
} 

または

public <C> void (Class<C> clazz) { 
    A<C> a = ...; 
} 
+0

申し訳ありませんが、私は本当にこの場合のメソッドシグネチャを変更することはできません。他の方法はありませんか? – tsiki

+0

メソッドまたはクラスがそのシグネチャで型を宣言していない場合は、メソッド本体でジェネリックを使用できません。 – Bohemian

+0

@Bohemianメソッドが最初のケースで呼び出されたときに、型Cはどのように推論されますか? – edutesoy

1

cはオブジェクトです。そして、ジェネリック変数を定義している間だけクラスを与えることができます。

だからA<'ClassName'>が正しい方法です。

関連する問題