2011-01-22 9 views
3

組み合わせジェネリック医薬品と反射私は2つのクラスがあります。genericクラスのtypeクラスのオブジェクトをパラメータとして使用するにはどうすればよいですか? -

public abstract class MyAbstractSuperClass<A, B> { 

    public MyAbstractSuperClass(Class<A> a, Class<B> b) { 
     ... 
    } 

    ... 
} 

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass<A>> { 

    public MyClass(Class<A> a) { 
    super(a, MyOtherClass.class)); 
      ... 
    } 

    ... 
} 

今、あなたは見に、サブクラスはスーパークラスのコンストラクタを呼び出す必要があります。そのラインで私は次のエラーを取得する:

The constructor MySuperClass<A, MyOtherClass<A>>(Class<A>, Class<MyOtherClass>) is undefined 
  • それでは、どのように私はタイプClass<MyOtherClass<A>>のオブジェクトを取得するのですか?
  • そして、私はそれほど実行できないスーパーコンストラクタコールでどのようにしますか?

ありがとうございます。これはある意味で「責任を転嫁」んが、それは実際にクラスを提供することができます誰かにバックを渡します

public MyClass(Class<A> a, Class<MyOtherClass<A>> bClass) { 
    super(a, bclass)); 
} 

@Bert F:

+0

エラーメッセージで参照されるクラス「MySuperClass」はありません。そのエラーは次のように解釈されます: 'コンストラクタMyAbstractSuperClass <... ' –

答えて

-1

あなたはMyClassコンストラクタに二番目の引数を追加する必要があります適切な型のリテラル。呼び出し元は、型変数Aの実際の値を知っているため、正しい型のクラスリテラルを提供できます。消去のため、MyClassはできません。

+1

これはちょうどドルを渡しませんか? 'MyClass'をインスタンス化しようとするコードは、以前のMyClassと同じ問題を抱えていませんでしたか?具体的なパラメータ化された型のクラスリテラルを作成できませんか? –

0

MyClass定義のタイプパラメータMyOtherClassを削除します。あなたは明らかに、MyClass 'の本文のどこにでも興味がありません。

public class MyClass<A> extends MyAbstractSuperClass<A, MyOtherClass> { 
    public MyClass(Class<A> a) { 
     super(a, MyOtherClass.class); 
    } 
} 

警告が表示された場合は、@SuppressWarnings("rawtypes")を追加してください。

1

コンストラクタには、ではなく、Class<MyOtherClass<A>>が必要です。私はコンパイラを満足させるために考えることができる唯一の方法は、キャストの醜い一連のです:

@SuppressWarnings("unchecked") 
public MyClass(Class<A> a) { 
    super(a, (Class<MyOtherClass<A>>)(Class<?>)MyOtherClass.class); 
} 

検査を通して見た生タイプMyOtherClassためのクラスリテラルがパラメータの場合と同じであるので、それは、タイプセーフでありますMyOtherClass<A>。しかし、これは未確認の警告が生成されるのを止めるものではなく、上記のように抑制するか、単に無視することができます。

関連する問題