在Java中围绕类型擦除设计构造函数

时间:2010-04-24 07:14:14

标签: java conventions type-erasure

昨天,我正在设计一个Java类,我希望通过各种泛型类型列表进行初衷:

TheClass(List<String> list) {
   ...
}

TheClass(List<OtherType> list) {
   ...
}

这不会编译,因为构造函数具有相同的擦除。

我只是选择了以他们的名字区分的工厂方法:

public static TheClass createWithStrings(List<String> list)
public static TheClass createWithOtherTypes(List<OtherType> list)

这不是最优的,因为没有一个明显的位置可用于创建实例的所有不同选项。

我试图寻找更好的设计理念,但结果却少得惊人。围绕这个问题设计还有哪些其他模式?

3 个答案:

答案 0 :(得分:2)

我很想知道解决这个问题的方法。

我经常遇到同样的问题,我通常只是通过向构造函数引入一个伪参数(例如Void)来修复它,这当然不是最优雅的修复,但是我知道的最好的一个。到目前为止。

答案 1 :(得分:1)

注意,可以使用擦除在泛型参数上添加方法重载,尽管通配符会使其变得更加困难。

我建议使用基于类型解释的名称创建方法。 String本身并没有多大意义。 createWithThingNames或其他什么。

某些静态类型的语言根本没有方法重载(故意)。

答案 2 :(得分:0)

差异化解决方案:

1)带标签

class TheClass
{
 TheClass(String[] strings)   {}
 TheClass(Object[] others) {}
}

2)使用泛型

class TheClass<P>
{
 TheClass(P generic) {}
}