您可以使用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
你並不完全正確。我最初的解決方案是'Heap'列表中的變量示例。但是您可以使用非常類似的方式在'Stack'列表中的變量中使用反射。我用該解決方案更新我的答案 – GuilhermeFGL
你可以讓它工作,我不能。 https://repl.it/KO5D/3 –