Java:从泛型类中填充动态列表

时间:2016-09-08 18:11:40

标签: java android list generics

我有一个班级:

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中声明了一个空构造函数。

3 个答案:

答案 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;
}