0
interface Borrowable { 
    Date getCheckoutDate(); 
    Date getDudeDate(); 
    void setCheckoutDate(Date d); 
    void setDudeDate(Date d); 
} 

В следующем классе есть все функции, которые имеет арраист. Я тестировал их все, и они отлично работают.Почему класс # getComponentType возвращает null вместо общего типа ArrayList (Java)?

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) {...} 
... 
..... 
...... 
} 

здесь, где я не могу понять до, как сделать «T [] getOverDueBooks (дата дата)», чтобы вернуть действительный массив. Я пытаюсь сделать это, потому что это требование в моем классе java.

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

в основном я сделал cauple из DVD и объектов книги, и они полностью инициализированы я опустил инициализацию причина слишком долго. Я поставил тогда в MyCar

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 

Я новичок в Java. любая идея или примеры, которые я могу использовать, чтобы выполнить эту задачу, я оценю навсегда ... спасибо

+0

Название вопроса может быть улучшено. Предложение: «Почему класс # getComponentType не возвращает общий тип ArrayList?» Возможно, связано: [Как создать общий массив в Java?] (Http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java) – stholzm

ответ

1

Class#getComponentType Из Javadoc:

Возвращает класс, представляющий тип компонента массива. Если этот класс не представляет класс массива, этот метод возвращает null.

items - ArrayList, а не массив. Общий тип ArrayList недоступен во время выполнения из-за Тип Erasure.

Непонятно, почему вы хотите вернуть T[]. Возможно, вы захотите использовать E, который уже расширяет Borrowable. И если вы действительно хотите вернуть массив, возможно, после toArray?

+0

спасибо за ответ и ваш время. Я пытаюсь сделать это, потому что это требование в моем классе java. Я знаю, что ваш ответ правильный, но все же я не понимаю, что не так, извините, но я довольно новичок в этом. Еще раз спасибо – antirrabia

+0

Я могу только догадываться, что вы не понимаете, но, может быть, мои изменения прояснили все равно? – meriton

+1

Можете ли вы уточнить, что именно вы не понимаете? Может быть, это помогает: тип компонента массива и общий тип, например ArrayList, действительно являются двумя разными животными. Вы можете получить доступ к типу компонента во время выполнения с помощью 'Class # getComponentType' (только для массивов), но общие типы - в общем случае - недоступны для самоанализа. Есть несколько хороших вопросов о * Type Erasure * здесь, которые вы можете прочитать для лучшего понимания системы типов Java. Спасибо @meriton кстати. К сожалению. – stholzm

Смежные вопросы