2016-05-28 153 views
2

说我有两个构造函数接受某种类型的输入。 (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构造函数调用不在第一行,因此给出编译错误。

+0

这在Java中是不可能的。你应该以另一种方式满足你的要求。如果你需要更多的帮助,你应该添加你的具体要求。 –

+0

为什么在创建测试对象之前不投射? – Dandelion

+0

@Vasei如果T1或T2被一些其他方法以Object的形式返回(在我的例子中,一个可以返回一个Map或一个String的反序列化器),那么处理反序列化的类可以传递下去 – lennartVH01

回答

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; 
    } 
} 
+0

,这个解决方案将不起作用。如果这是唯一的方法,那么我将使用它,但使用静态方法创建一个类的对象似乎有点奇怪该类而不是构造函数 – lennartVH01

+0

我不认为这是唯一的方法。但它也不是创建对象的奇怪方式。您可能想阅读Effective Java为什么它比使用构造函数更好的选项[Item 1](http://www.informit.com/articles/article.aspx?p=1216151) – ujulu

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); 
    } 
} 
+0

我考虑过这个问题,但是如果这个类包含最终字段 – lennartVH01

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); } 
    ... 
    } 
} 
+0

无效。 T2不延伸T1。而且,这会产生相同的错误。 – lennartVH01

+0

好吧,我想念你的问题。抱歉。 :(但是我推荐工厂方法作为ujulu展示。 –