2016-05-28 152 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展示。 –