【问题标题】:Java: Fill a dynamic list from a generic classJava:从泛型类中填充动态列表
【发布时间】:2016-09-08 18:11:39
【问题描述】:

我有一堂课:

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

【问题讨论】:

  • “这条线不起作用”是什么意思?编译器会抛出什么错误?
  • List&lt;Car&gt; list = new ArrayList&lt;&gt;(); 怎么样?如果您有此列表的汽车收藏cars,那么您可以使用List&lt;Car&gt; list = new ArrayList&lt;&gt;(cars);。它比DB&lt;T&gt; 更容易,你仍然可以进行读取、更新、插入和删除操作。

标签: java android list generics


【解决方案1】:

我相信这是不言自明的

无法实例化类 com.example.myprojects.Car;没有空 构造函数

确实调用Class#newInstance() 将使用空构造函数(没有参数的构造函数)动态创建类的新实例,因此如果您没有在类中定义空构造函数Car , 你会得到这个异常。

如果空构造函数对你来说不够好,你仍然可以使用Class#getConstructor(Class&lt;?&gt;... parameterTypes)通过反射获得给定的构造函数,然后你可以从Constructor实例调用Constructor#newInstance(Object... initargs)来创建你的实例。


您的类DB 不需要目标类的显式实例,只需要目标类实例。也就是说,应该改写成next:

 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());
    }
}

那么你就可以得到ListCar 作为下一个

List<Car> list = new DB<>(Car.class).getList();

【讨论】:

    【解决方案2】:

    Car类中添加空构造函数:

     public Car() {}
    

    【讨论】:

      【解决方案3】:

      您是否尝试将内部类声明为静态?

      public static class Car {
          public int year;
          public String model;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多