如何使用不同数量的arraylists重载构造函数?

时间:2015-09-19 02:22:01

标签: java generics arraylist constructor

我想用独立的构造函数独立初始化几个不同的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(" ");
    }
}

4 个答案:

答案 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);