3 回答
TA贡献1804条经验 获得超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
顺便说一句:在运行时有一个“类型擦除”,并且无法获取List
fromList
实现中的对象类型。
总之在运行时它总是 List<Object>
TA贡献1876条经验 获得超6个赞
如果您总是返回项目列表,则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 {
}
TA贡献1843条经验 获得超7个赞
不要使用Class<T>参数和反射(即Class.newInstance())。使用 aSupplier<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);
添加回答
举报