2013-09-25 109 views
0

我有这个问题新<T>在Java中

的方法,它是由一类切割不需要的细节,并与那些通缉返回对象的集合。问题是我希望这个metod能够与不同的类一起工作(虽然它是基于一个抽象的),所以我使用泛型类型。问题是有一点我需要创建一个实例,这是不可能的。我寻找了一些出路,但似乎不适合我的情况。 所以,代码如下

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates) { 
    List<T> restMandates = new ArrayList<>(mandates == null ? 0 
      : mandates.size()); 
    if (mandates != null) { 
     for (CardMandate mandate : mandates) { 
      restMandates.add(new T(mandate)); 
     } 
    } 

    return restMandates; 
} 

RestMandate是基类,CardMandate是我取的信息。有任何想法吗?

+0

你想简单地从列表''到'名单'转换? –

+0

实际上是的)问题是,CardMandate的对象有太多争论,我正在*取出它们。如果你有其他更简单的解决方案,我将不胜感激) – spl1n

+0

你是什么意思*对象有太多的论据?* –

回答

3

由于泛型类型参数在运行时被擦除,有没有办法可以参考它就像你正在尝试做的。唯一的出路是一个类型标签参数+反射实例化。

更好的选择是重新设计您的解决方案来解决这个问题,而不依赖于泛型和类型标签。改为使用动态方法调度:向RestMandate添加一个方法,该方法将返回转换为所需类型的对象。

+0

我明白,但我喜欢这种方法)它是如此的好,除了这件事与实例化。我会在工厂模式中执行以防万一没有解决方案可以帮助 – spl1n

+0

它会在其他语言中有很好的效果 –

1

要创建一个实例你需要Class<T>对象太

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates, Class<T> clazz) { 
    //.... 
    T newInst = clazz.newInstance(); 

    //.... 
} 
+0

我见过这个,newInstance有例外的麻烦,程序不想支持variant Constructor.newInstance() – spl1n

+0

他正在使用参数化的构造函数。 'newInstance()'需要一个0-arg构造函数。 –

+0

是的,http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance() – spl1n

3

由于Type Erasure,T在运行时变为对象。你不知道它的真实类型了。

如果你有它的类,你仍然可以通过反射来实例化对象。为了做到这一点,你必须给类的方法:

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates, Class<T> clazz) { 
    ... 
    for (CardMandate mandate : mandates) { 
    /* 
     * I get the constructor which needs one CardMandate and call it. 
     * Note : I do not recommend this solution (no check at compile-time!). 
     * Like Marko Topolnik, I advise to redesign the solution. 
     */ 
    restMandates.add(clazz.getConstructor(CardMandate.class).newInstance(mandate)); 
    } 
    ... 
} 
+0

他正在使用参数化构造函数。 'newInstance()'需要一个0-arg构造函数。 –

+0

编辑,谢谢。 –

+0

我不能称这一个。它一直说类型不匹配。 列表 cardMandates; List restMandate; toRestMandate(cardmandates,restMandate); – spl1n