我有一个班级:
public class Car {
public int year;
public String model;
}
和一个清单:
List<Car> list = new DB<>(new Car()).getList();
我需要从我的类Car填充该列表以填充例如json数组或来自sqlite db的表。
下面我有我的通用类,它想填充它:
public class DB<T>{
private T type;
public DB(T type){this.type = type;}
public List<T> getList(){
List<T> list = new ArrayList<>();
for(int i=0; i<2; i++){
T object = (T)type.getClass().newInstance();// this line doesn't work
list.add(object);
}
return list;
}
}
我的问题在于当我尝试创建一个新的'T'实例以在我的列表中添加一个新的不同对象时。
我尝试过这样的事情:
T object = new T();
但是返回一个空对象,所以我尝试做一个演员(我在我的泛型类中做的那个),我的控制台给了我这个错误:
java.lang.InstantiationException:无法实例化类 com.example.myprojects.Car;没有空构造函数
我不知道我是否遗漏了某些东西,所以我的问题是为什么这不会让我创建一个新实例,或者是否有另一种解决方法可以帮助我创建一个新实例?
编辑:按照Nicola的回答,我改写了我的通用类:
public class DB<T>{
private Class<T> type;
public DB(Class<T> type){this.type = type;}
public List<T> getList() throws IllegalAccessException, InstantiationException {
List<T> a = new ArrayList<>();
try{
a.add(type.newInstance());// Still can't instance
}cath(Exeption e){e.printStackTrace(); }
}
return a;
}
但是我的控制台继续显示同样的错误,甚至在我的班级Car
中声明了一个空构造函数。
答案 0 :(得分:2)
我认为这是不言自明的
无法实例化类com.example.myprojects.Car;没空 构造
确实调用Class#newInstance()将使用空构造函数(没有参数的构造函数)动态创建类的新实例,所以如果你没有在类中定义一个空构造函数{ {1}},您将获得此异常。
如果空构造函数不够好,您仍然可以使用Class#getConstructor(Class<?>... parameterTypes)
通过反射获得给定的构造函数,然后从Car
实例调用Constructor#newInstance(Object... initargs)
来创建实例
您的班级Constructor
不需要目标类的显式实例,只需要目标类实例。换句话说,它应该被重写为下一个:
DB
然后,您将能够获得 public class DB<T>{
private Class<T> type;
public DB(Class<T> type){this.type = type;}
public List<T> getList() throws IllegalAccessException, InstantiationException {
return Arrays.asList(type.newInstance(), type.newInstance());
}
}
List
作为下一个
Car
答案 1 :(得分:0)
在课程Car
中添加空构造函数:
public Car() {}
答案 2 :(得分:0)
您是否尝试将内部类声明为静态?
public static class Car {
public int year;
public String model;
}