[英]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()
方法:
Object[] toArray()
:此方法不帶參數,它返回一個數組,其運行時 class 始終為Object[]
。 這是因為該集合在運行時不知道它的組件類型是什么,並且沒有任何 arguments,它沒有關於在運行時創建什么組件類型的數組的信息。<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.