我想用独立的构造函数独立初始化几个不同的ArrayLists。我很容易 用类来实现我所需要的 除了默认值之外只有一个辅助构造函数,但是为了知道为什么它不起作用,我很欣赏一些见解。
public class MultiConstruct
{
ArrayList<Integer> first;
ArrayList<Float> second;
public MultiConstruct(){};
public MultiConstruct(ArrayList<Integer> f){
this();
this.first = f;
System.out.println("MultiConstruct version one handled successfully...");
System.out.println(" ");
}
public MultiConstruct(ArrayList<Float> s){
this();
this.second = s;
System.out.println("MultiConstruct version two handled successfully...");
System.out.println(" ");
}
}
答案 0 :(得分:4)
您可以使用静态工厂方法而不是构造函数来解决此问题。
在Joshua Bloch的书中,#34; Effective Java&#34; - 第1项他描述了使用静态工厂方法而不是构造函数的优点(和缺点),其中一个优点是静态工厂方法具有名称,与构造函数不同。
答案 1 :(得分:1)
您不能基于泛型的参数重载。 List<A>
和List<B>
在运行时都只是'List'。你需要将一些标志传递给构造函数;你可能需要:
<T> MyClass(List<T> list, Class<T> clazz) {
if (clazz == Float.class) {
} else {
}
}
我不能保证这会编译。一般的想法是你需要找到除了重载之外的其他东西来进行选择。
答案 2 :(得分:1)
错误是因为它们具有相同的擦除“ArrayList”,这使得两个构造函数在运行时具有相同的签名。您最好的选择可能是尝试使用无界通配符https://docs.oracle.com/javase/tutorial/java/generics/unboundedWildcards.html 您需要在构造函数中使用某些代码检查类型,然后从那里继续。
答案 3 :(得分:1)
只需添加一个参数来消除歧义两个
public MultiConstruct(ArrayList<Integer> f, int _ignore)
public MultiConstruct(ArrayList<Float > s)
看起来很傻,但这是一种可接受的做法。
有趣的是,这也有效:)
public MultiConstruct(int ignore, ArrayList<Integer> f)
public MultiConstruct(float ignore, ArrayList<Float > s)
----
ArrayList<Integer> list1 = ...;
ArrayList<Float > list2 = ...;
new MultiConstruct(0, list1);
new MultiConstruct(0, list2);
您还可以定义一个构造函数,接收两个列表
public MultiConstruct(ArrayList<Integer> f, ArrayList<Float> s)
并要求调用站点提供其中一个参数为null
new MultiConstruct(list1, null);
new MultiConstruct(null, list2);