Java Reflection
を使用してこれを実現できます。
例があります:あなたのケースでは
public class Test {
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
public static void main(String... args) throws Exception {
Field stringListField = Test.class.getDeclaredField("stringList");
ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType();
Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0];
System.out.println(stringListClass); // class java.lang.String.
Field integerListField = Test.class.getDeclaredField("integerList");
ParameterizedType integerListType = (ParameterizedType) integerListField.getGenericType();
Class<?> integerListClass = (Class<?>) integerListType.getActualTypeArguments()[0];
System.out.println(integerListClass); // class java.lang.Integer.
}
}
あなたの関数のパラメータの型を取得する必要があります。この場合、Reflection
は、同じ方法でユーザーであることができ、あなたのパラメータで、使用して:
public void onFilter(ArrayList items) {
// using
items.getClass().getGenericSuperclass();
// or
((ParameterizedType) items
.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0]);
}
このところで、あなたのArrayList
は、任意のアイテムを持っている必要はありません。
の場合、はランタイムで相対ジェネリック型を取得することはできません。ジェネリックのコンパイル時にデータ型が消去されるためです。
Link to related awnser
理由はわかりませんでした。 @OrkhanAlikhanovあなたのコメントを開発してください。 – GuilhermeFGL
あなたは完全に正しいわけではありません。私の元々の解決策は 'ヒープ'リストの変数の例です。しかし、非常によく似た方法で 'Stack'リストの変数でリフレクションを使うことができます。私はその解決策で私の答えを更新する – GuilhermeFGL
あなたはそれを働かせることができますか? https://repl.it/KO5D/3 –