2016-05-13 358 views
-2

这是星期五晚上,所以我可能会有点慢,但我无法解决我认为这是一个简单的问题。Java泛型和反射|如何实例化一个泛型类

我基本上有这种情况。

1)基础类MyDAO

public abstract class MyDAO<K, E> implements DAO<K, E> 
{ 
    .... 
} 

2)一束在一个给定包MyDAO具体类实现的,说:

public class TaxonomyDAO extends MyDAO<Integer,Taxonomy>{ 

    .... 
} 

每个类延伸MyDAO基本上添加特定DAO设有relevanto到他们的E元素。我正在编写一个通用工厂,其目标是使用反射来提供WhateverClassDAO的实例,如果此类存在,并且返回基本MyDAO,则返回基本MyDAO。我们假设K总是整数。

我已经写了这样的事情:

public Object getDAOForEntity(Class c) 
    { 
     createEmfa(); 

     try { 
      Class eDao = Class.forName(getClass().getPackage().getName()+c.getSimpleName()+"DAO"); 
      Constructor<?> cons = eDao.getConstructor(EntityManagerFactory.class);    
      return cons.newInstance(emfa); 
     } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { 
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); 
      return new MyDAO<Integer,?????>(emfa) {}; 

     }   
    } 

这个类,给定一个Class c(说WhateverClass)尝试使用反射来创建使用参数化构造函数的WhateverClassDAO实例。假设***DAO类与工厂中的相同包(我试图保持足够简单以便在此处发布)。

在捕获,因为反射失败,我假设没有Wha​​teverClassDAO,所以我想返回一个MyDAO<Integer,WhateverClass>,但我不能在那里通过正确的E参数。我试图通过Class<E>作为一个没有运气的论据。我基本上想知道什么可以替代?????。

它超出了范围,但所有这些代码都在Singleton EJB中。

任何帮助,即使在正确的文档链接形式,将不胜感激。

+0

只有Chuck Norris可以在java中实例化一个抽象类。 – aviad

+0

好,我当之无愧 – elbuild

+0

我希望我没有得罪。只是在开玩笑;)如果没有这样的DAO存在,我只会返回一个可选的缺席。 – aviad

回答

1

Class也是通用的,你可以从中推断出正确的泛型参数:

public <E> Object getDAOForEntity(Class<E> c) { 
    try { 
     // ... 
    } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { 
     return new MyDAO<Integer,E>(emfa) {}; 
    } 
} 
+0

我以前试过,忘记在类型声明< E >方法声明的开始...下午7点20分...有时间休息。感谢您的快速回答:) – elbuild

+0

我要在两分钟内接受 – elbuild

1

你应该做一个通用的方法,也最好让它回到你的DAO基类,而不是对象:

public <E> MyDAO<Integer, E> getDAOForEntity(Class<E> c) { 
    ... 
    try { 
     Class<MyDAO<Integer, E>> eDao = (Class<MyDAO<Integer, E>>)(Class<?>)Class.forName(getClass().getPackage().getName()+c.getSimpleName()+"DAO"); 
     Constructor<MyDAO<Integer, E>> cons = eDao.getConstructor(EntityManagerFactory.class);    
     return cons.newInstance(emfa); 
    } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { 
     return new MyDAO<Integer,E>(emfa) {}; 
    }   
    } 
+0

我回来了。在发布之前,我很快编辑了代码。此外,类名不是那些 – elbuild

+0

好。也可以摆脱警告,你可以添加@SuppressWarnings(“unchecked”) – yurgis