簡體   English   中英

類強制轉換異常泛型反射ParameterizedType

[英]Class Cast Exception Generics Reflection ParameterizedType

我已經在Stack上尋找答案了一段時間。 所有答案看起來都像他們說的我已經有了正確的答案,但是我仍然在下面的構造函數的第一行中始終收到類強制轉換異常。

SEVERE: Exception while loading the app : EJB Container initialization error
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at com.domain.security.logging.ElsAbstractCrudClass.<init>(ElsAbstractCrudClass.java:54)

這是代碼。 在查看了文檔之后,我仍然無法弄清楚。 我對泛型和反射比較陌生,因此需要一些幫助。 TIA。

    public abstract class ElsAbstractCrudClass<T> {
        Class<T> entity;

        public ElsAbstractCrudClass() {

[line 54]   ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
            Type type = genericSuperclass.getActualTypeArguments()[0];
            this.entity = (Class<T>) type;

        }
    }

這是抽象Crud類的子類(SessionLog是JPA實體):

@Stateless
public class SessionLogger extends ElsAbstractCrudClass<SessionLog> {

    @PersistenceContext(unitName = "ELS_Soulard_PU")
    private EntityManager em;
    @EJB
    DozerInstantiator di;
    //SessionLog entity;
    //SessionLog sessionLog = new SessionLog();
    static final Logger logger = Logger.getLogger(SessionLogger.class.getSimpleName());

    public SessionLogger() {
    }
...

如果超類是通用類,則getGenericSuperclass返回ParameterizedType的實例,否則則返回Class的實例。 大概你有這樣的東西:

class A extends B { ... }
class B extends ElsAbstractCrudClass<Person> { ... }

現在getClass()返回A.class與超B.class ,這不是一般的...

只要運行時類不是通用類,就可以使您的代碼片段通用化(遞歸地遍歷類型層次結構,隨便用它們的定義替換類型參數)。 但是,除非您有數十個crud類,否則要求子類傳遞正確的類對象會更容易:

public abstract class ElsAbstractCrudClass<T> {
    final Class<T> entityClass;

    public ElsAbstractCrudClass(Class<T> entityClass) {
        this.entityClass = entityClass;
    }
}

您收到此錯誤是因為EJB容器擴展了您的Stateless bean,以在方法調用時包裝EJB特定的邏輯。 因此,在部署時,您會遇到以下情況:

ContainerSubclass extends SessionLogger {}

解決方案:

1)在你的構造函數中第一次調用

... = getClass().getSuperClass();
...

2)或針對接口編寫代碼,以便EJB容器可以通過反射創建動態代理。

遇到麻煩的另一種方法是,如果擴展類使用的是原始類型,而不是泛型。 換句話說,此子類將生成您的異常,因為其超類型只是原始類型ElsAbstractCrudClass。

public class EE extends ElsAbstractCrudClass { ... }

但這不是因為它的超類型是ElsAbstractCrudClass的泛型類型

public class EE extends ElsAbstractCrudClass<String> { ... }

暫無
暫無

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

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