3

私は機能を持っています:

add(Collection<?> many)

私はそれを次のように呼びます:

Collection<NewClass> awa = new ArrayList<NewClass>();
add(awa)

<?>タイプを取得するにはどうすればよいですか?その機能で?

many.getClass()を与えArrayListます。

なぜこれが必要なのですか?のコレクションを追加するための一般的な DAO メソッドを作成しようとしてい< ? >ます。

編集:

このように試しました:

public static void add(Collection<?> many)  {
    Type typeArg = ((ParameterizedType)Testing.class.getGenericSuperclass()).getActualTypeArguments()[0];
    System.out.println(typeArg);
}

    Collection<NewClass> awa = new ArrayList<NewClass>();


    add(awa);

エラーが発生しました:

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
4

4 に答える 4

4

many.getClass()を与えArrayListます。

確かに、それは正しいように聞こえます。

many.get(0).getClass()代わりにやったら?ここでは、コンテナーではなく要素を調べています。私は C#er なので、これが 100% 正しい方法ではないかもしれませんが、C# ではこの方法を採用します。

于 2012-08-07T14:14:32.577 に答える
1

この問題を回避して、メソッドをジェネリックにすることができます。例:

public <T> void add(Collection<T> blah){}

あなたはそれを呼び出すことができます

this.<NewClass>add(awa);

別のクラスにある場合は

DifferentClass dc = new DifferentClass();
dc.<NewClass>add(awa);
于 2012-08-07T14:23:44.493 に答える
1

このようなことを試してみませんか:

public class Test {

  Test() {
    Collection<Integer> ints = new ArrayList<Integer>();
    add(ints, Integer.class);
    Collection<String> strings = new ArrayList<String>();
    add(strings, String.class);
  }

  public final <T> void add(Collection<T> many, Class<T> type) {
    System.out.println(type.getName());
    // do whatever needed.
  }

}
于 2012-08-07T14:29:54.277 に答える
1

実行時に実際の型引数を確認できますが、これはフィールド、メソッド、コンストラクターなどからリフレクション API を介してのみ読み取ることができます。以下のサンプル:

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;


public class TypesSample {

    public List<String> sampleList;


    public static void main(String[] args) throws Exception {
        Field f = TypesSample.class.getField("sampleList");
        ParameterizedType paramType = (ParameterizedType)f.getGenericType();
        Type typeArgument = paramType.getActualTypeArguments()[0];
        System.out.println(paramType.toString() + " with argument : " + typeArgument.toString());
    }


}

それは言う:java.util.List<java.lang.String> with argument : class java.lang.String

型消去のため、オブジェクト参照から実際のパラメーター型を取得できません。

//編集:

これはあなたの状況に対してあなたができることです:

abstract class GenericDAO<T> {

    public void add(Collection<T> many) {
        Type typeArg = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        System.out.println("This is a DAO for " + typeArg);
    }

}

    // create DAOs that define what type parameter is   
class IntegerDAO extends GenericDAO<Integer> {}
class StringDAO extends GenericDAO<String> {}

その後 :

GenericDAO<Integer> integerDAO = new IntegerDAO();
integerDAO.add(Arrays.asList(1,2,3));
GenericDAO<String> stringDAO = new StringDAO();
stringDAO.add(Arrays.asList("A","B","C"));

発言: これはクラス java.lang.Integer の DAO です これはクラス java.lang.String の DAO です

Tただし、ジェネリック クラスを拡張して明示的に宣言する必要があります。

于 2012-08-07T14:46:06.940 に答える