您可以使用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 –