我在Java中使用通用方法,我想使用自定义对象列表作为参数。
我的主要班级是:
public class Main {
public static <T> T executeGetRequest(String target, Class<T> resultClass) {
//MY STUFF
T result = resultClass.newInstance();
return result;
}
public static void main(String[] args) {
executeGetRequest("myList", List<myCustomObject>.class); // ERROR HERE
}
}
我想使用List<myCustomeObject>
作为参数。当我使用List.class
时,没有错误,但是我不确定结果是否会投射到myCustomObject
中。
答案 0 :(得分:2)
代码很破损...
List<myCustomObject>.class
是错误的,只能是List.class
List
是一个接口,对List.class.newInstance();
的调用仍然会引发异常
即使您将执行以下代码:
List<myCustomClass> myList = new ArrayList();
Object myResult = executeGetRequest("myList", myList.getClass());
您将返回myResult
作为ArrayList
类的实例...
您需要重新考虑要达到的目标-取回myCustomClass
对象的列表或myCustomClass
的新实例
BTW:在运行时存在“类型擦除”,并且无法从List
实现中获取List
中的对象类型。
简而言之,在运行时始终为List<Object>
答案 1 :(得分:1)
如果您始终返回项目列表,请使用List<T>
作为返回类型:
public class Main {
public static <T> List<T> executeGetRequest(String target, Class<T> resultClass) throws IllegalAccessException, InstantiationException {
T item = resultClass.newInstance();
List<T> result = new ArrayList<>();
result.add(item);
return result;
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
executeGetRequest("myList", Foo.class);
}
static class Foo {
}
答案 2 :(得分:0)
请勿将Class<T>
参数与反射(即Class.newInstance()
)一起使用。请改用Supplier<T>
:
public static <T> T executeGetRequest(String target, Supplier<T> factory) {
// MY STUFF
T result = factory.get();
return result;
}
然后,按如下所示调用它:
List<myCustomObject> result = executeGetRequest("myList", () -> new ArrayList<>());
创建<>
时,甚至可以使用菱形运算符(ArrayList
),因为这是由编译器(即List<myCustomObject>
)从左侧推断出来的。
您还可以使用方法参考:
List<myCustomObject> result = executeGetRequest("myList", ArrayList::new);