昨天,我正在设计一个Java类,我希望通过各种泛型类型列表进行初衷:
TheClass(List<String> list) {
...
}
TheClass(List<OtherType> list) {
...
}
这不会编译,因为构造函数具有相同的擦除。
我只是选择了以他们的名字区分的工厂方法:
public static TheClass createWithStrings(List<String> list)
public static TheClass createWithOtherTypes(List<OtherType> list)
这不是最优的,因为没有一个明显的位置可用于创建实例的所有不同选项。
我试图寻找更好的设计理念,但结果却少得惊人。围绕这个问题设计还有哪些其他模式?
答案 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) {}
}