重载的构造函数根据输入类型调用其他构造函数

时间:2016-05-28 13:14:18

标签: java constructor

假设我有两个构造函数采用某种类型的输入。 (本例中为T1和T2)

我想从一个更通用的构造函数中调用它们中的任何一个(或者任何超类T1和T2)

class Test{
    public Test(T1 input){...}
    public Test(T2 input){...}

    public Test(Object input){
        if(input instanceof T1)
            this((T1) input);
        if(input instanceof T2)
            this((T2) input);
}

第三个构造函数会发出编译错误,因为this构造函数调用不在第一行。

3 个答案:

答案 0 :(得分:3)

您可以使用以下一种工厂方法:

public class Test {
    private Test(T1 input) {
        // ...
    }

    private Test(T2 input) {
        // ...
    }

    public static Test createTest(Object input) {
       if (input instanceof T1)
          return new Test((T1) input);
       if (input instanceof T2)
          return new Test((T2) input);
        return null;
    }
}

答案 1 :(得分:2)

只需编写一个构造函数(带有Object参数的构造函数),然后将另外两个构造函数转换为私有方法,而不是编写三个构造函数。现在称它为:

class Test{
    private void initT1(T1 input){...}
    private void initT2(T2 input){...}

    public Test(Object input){
        if(input instanceof T1)
            initT1((T1) input);
        else if(input instanceof T2)
            initT2((T2) input);
    }
}

答案 2 :(得分:0)

instanceof是必要的吗?当T1是T2的超类时。

class T1 { }
class T2 extends T1 { }

class Test {
  public Test(T1 input) { ... }
  public Test(T2 input) {
    this((T1)input); // T2 extends T1.
    // or
    if(input instanceof T1) { this((T1)input); }
    ...
  }
}