为什么类#getComponentType返回null而不是ArrayList(Java)的泛型类型?
下一个类具有arraylist所具有的所有函数。我已经测试了所有这些,它们工作得非常好为什么类#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的: 返回
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