为什么类#getComponentType返回null而不是ArrayList(Java)的泛型类型?

为什么类#getComponentType返回null而不是ArrayList(Java)的泛型类型?,java,generics,reflection,dynamic-arrays,generic-collections,Java,Generics,Reflection,Dynamic Arrays,Generic Collections,下一个类具有arraylist所具有的所有函数。我已经测试了所有这些,它们工作得非常好 interface Borrowable { Date getCheckoutDate(); Date getDudeDate(); void setCheckoutDate(Date d); void setDudeDate(Date d); } 我是java新手。任何我可以用来完成这项任务的想法或例子,我将永远感激。。。感谢来自类#getComponentTypeJavadoc的: 返回

下一个类具有arraylist所具有的所有函数。我已经测试了所有这些,它们工作得非常好

interface Borrowable {
  Date getCheckoutDate();
  Date getDudeDate();
  void setCheckoutDate(Date d);
  void setDudeDate(Date d);
}
我是java新手。任何我可以用来完成这项任务的想法或例子,我将永远感激。。。感谢来自
类#getComponentType
Javadoc的:

返回表示数组的组件类型的类。如果这 类不表示此方法返回的数组类null

items
是数组列表,而不是数组。由于类型擦除,无法在运行时访问ArrayList的泛型类型


不完全确定为什么要返回
T[]
。您可能想改用
E
,它已经扩展了
可借用的
。如果你真的想返回一个数组,可以在
toArray

之后强制转换,问题标题可以改进。建议:“为什么类#getComponentType不返回ArrayList的泛型类型?”可能与此相关:感谢您的回复和时间。我正试图这样做,因为这是我的java类中的一个需求。我知道你的答案是正确的,但我仍然不明白是什么错了,对此我很抱歉,但我对这一点很陌生。谢谢,阿加尼只能猜测你不懂的东西,但也许我的编辑澄清了问题?你能详细说明你不懂的东西吗?也许这会有所帮助:数组的组件类型和数组列表的泛型类型实际上是两种不同的类型。您可以在运行时使用
Class#getComponentType
(仅适用于数组)访问组件类型,但泛型类型通常不可用于内省。这里有一些关于类型擦除的好问题,您可能需要阅读,以便更好地理解Java的类型系统。谢谢@meriton btw.Oops。我从互联网上找到的一个定义中了解到如何处理我的问题,我想这是函数“public T[]toArray(T[]a){int size=size();T[]r=a.length>=size?a:(T[])java.lang reflect.Array.newInstance的正确定义(等等…’所以我想我可以在我的代码中使用它来获得我想要返回的数组,就像这个函数一样。但是我现在知道我在这一行是错的,这对我帮助很大,因为一开始我不知道我哪里出错了。谢谢
class LibraryCollection<E> {
  ArrayList<E> items = new ArrayList<>();

  public Iterator<E> iterator() {return items.iterator();}
  boolean add(E o) {return items.add(o);}
  boolean addAll(Collection<? extends E> c) {...}
...
.....
......
}
class ChechOutCart<E extends Borrowable> extends LibraryCollection<E> {
  ArrayList<E> dueOnSpecificDate = new ArrayList<>();
  ArrayList<E> dueOn = new ArrayList<>();

  <T> T[] getOverDueBooks(Date date) {
    T[] a = (T[]) java.lang.reflect.Array.newInstance(items.getClass().getComponentType(), items.size());
    Borrowable current;
    DVD d;
    Book b;

    for (int i = 0; i < items.size(); i++) {
      current = this.items.get(i);

      if (current instanceof Book) {
        b = (Book) current;
        if (date.after(b.getDudeDate())) {
          dueOn.add(this.items.get(i));
        }
      } else if (current instanceof DVD) {
        d = (DVD) current;
        if (date.after(d.getDudeDate())) {
          dueOn.add(this.items.get(i));
        }
      }
    } 
    return dueOn.toArray(a);
  }
}
public static void main(String[] args) {
    ChechOutCart<Borrowable> myCar = new ChechOutCart<>();
    Borrowable[] array;

    DVD dvd1 = new DVD();
    DVD dvd2 = new DVD();
    Book book1 = new Book();
    Book book2 = new Book();

    myCar.add(book2);
    myCar.add(dvd1);
    myCar.add(book1);
    myCar.add(dvd2);

    array = myCar.getOverDueBooks(new Date(115, 03, 23));
    System.out.println(array);
}
Exception in thread "main" java.lang.NullPointerException
at java.lang.reflect.Array.newArray(Native Method)
at java.lang.reflect.Array.newInstance(Array.java:75)
at labb_part_b.ChechOutCart.getOverDueBooks(LabB_Part_B.java:40)
at labb_part_b.LabB_Part_B.main(LabB_Part_B.java:147)
Java Result: 1