2011-11-06 20 views
1

私はC++用のJavaラッパーを作成しており、ジェネリッククラスを使ってC++テンプレートをラップしたいと考えています。したがって、ジェネリック型をStringとして取得したいので、JNIにさらに渡して対応するC++オブジェクトをインスタンス化することができます。Java:ジェネリック型を取得

EDIT:これは、私はそれを実装する方法である場合には、誰かが興味を持っている:

public class A<T> 
{ 
    private long ptr; 

     public static <E> A<E> create(Class<E> cls) 
     { 
      return new A<E>(cls); 
     } 

    private A(Class<T> cls) 
    { 
     ptr = create(cls.getName()); 

     if(ptr == 0) 
     { 
      throw new NullPointerException(); 
     } 
    } 

    private native long create(String className); 
} 
+0

質問は...? – home

+0

まあ、どうすればいいですか?私は単純にT.getClass()を書くことはできません。toString() – Pedro

答えて

4

のJavaのジェネリックはtype erasureのために時間を、コンパイル過去の型情報を保存しません。 TクラスのインスタンスをAクラスに渡す必要があります。

public class A<T> 
{ 
    private Class<T> type; 
    private long ptr; 

    public class A(Class<T> type) 
    { 
     this.type = type; 
     ptr = create(getGenericType()); 

     if(ptr == 0) 
     { 
      throw new NullPointerException(); 
     } 
    } 

    private String getGenericType() 
    { 
     return type.getName(); 
    } 

    private native long create(String className); 
} 
+0

最終的にコードは自分でしか使用されないので、より洗練されたソリューションを探しています。このようなインスタンシアンティングオブジェクト:A a = new A (String.class);あまりユーザーフレンドリーではありません。 – Pedro

+4

@ Pedro a)Java Genericsはそのように設計されており、私たちは何もできません。 b)静的ファクトリメソッドを使用してコードを改善できます。 'A a = A.ofType(String.class) ' –

+1

@Sean - ファクトリメソッドは良い提案です。 –

関連する問題