簡體   English   中英

java generics 類轉換異常

[英]java generics classcastexception

拋出異常是因為類型“E”被讀取為 class Object 而不是指定的參數。 應該是這樣嗎?

@Override
public E[] getAllEntities() {
    String jpdlQuery = String.format("select e from %s e", entityShortName);
    Query query = entityManager.createQuery(jpdlQuery, entityClass);
    return (E[]) query.getResultList().toArray();
}

您需要在某處的 class 定義中“泛化”方法public <E> E[] getAllEntities()或其他地方。

HOWEVER, mixing generics and arrays is a Really Bad Idea, since arrays have their base type at runtime and generics do not. 您將從演員(E[])收到編譯警告。

此外,您在createQuery()上遺漏了通用結果,它以您使用的形式返回TypedQuery<E> 如果您使用更具體的返回值,則不需要強制轉換。 此外,您不會返回原始List 不要使用原始類型。

https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#createQuery-javax .persistence.criteria.CriteriaQuery -https://docs.oracle.com/javaee/7/api/javax/persistence/TypedQuery.ZFC35FDC70D5FC69D7698Z83A822E

Arrays在運行時就知道它們的組件類型,所以在創建數組時,必須在運行時提供組件類型,而用不同的組件類型創建的arrays是不同運行時類的實例。 另一方面,泛型類的實例在運行時不知道它們的泛型類型 arguments。

Collection有兩個.toArray()方法:

  1. Object[] toArray() :此方法不帶參數,它返回一個數組,其運行時 class 始終為Object[] 這是因為該集合在運行時不知道它的組件類型是什么,並且沒有任何 arguments,它沒有關於在運行時創建什么組件類型的數組的信息。
  2. <T> T[] toArray(T[] a) :此方法接受一個數組參數,它返回一個與傳入的運行時 class 相同的數組。它通過返回相同的數組 object 或(如果傳入的數組不夠大)提取傳入數組的運行時 class 的組件類型,並使用它創建一個新的數組 object 相同的運行時 class。

您使用了沒有 arguments 的.toArray()方法; 因此它將始終返回一個數組 object ,其運行時 class 是Object[] ,就像由new Object[...]創建的一樣。 如果您希望您的getAllEntities()方法返回正確的運行時類型E[]的數組,它需要在運行時以某種方式知道E是什么; 為此,您需要讓調用者傳入E[]Class<E>類型的參數。 例如,

public E[] getAllEntities(E[] array) {
    //...
    return query.getResultList().toArray(array);
}

另一種方法是返回一個List ,它不需要在運行時知道它的組件類型,因此您可以在不知道E在運行時是什么的情況下創建List<E>

public List<E> getAllEntities() {
    //...
    return query.getResultList();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM