2015-08-27 46 views
-1

兩種方法具有相同的簽名,如果它們具有相同的名稱和 參數類型。判別不同返回類型的函數[Java],有沒有什麼技巧可以解決這個問題?

由於Java規範我知道,我們不能有兩種方法具有相同的名稱,具有相同的參數類型,但不同的返回類型。換句話說,用不同的返回類型重載函數是不可能的。

讓我們考慮我有兩種方法:

方法一:get(String s) return ObjectA;

方法2:get(String s) return ObjectB;

錯誤將occure由於複製的方法。我試着使用泛型來解決它:

T get(String s) return (T) Object;

現在我可以調用,使用例如: ObjectA = (ObjectA) get("FooBar"); 和它的作品。

但問題是,我想返回特定的對象,而在「主」,所以鑄造它

ObjectA = get("FooBar");

,而不是

ObjectA = (ObjectA) get("FooBar");

有沒有什麼絕招,通過返回類型區分函數?也許添加另一個參數?使用界面?我根本不知道如何在Java中解決這個問題。

我在C++中發現了一個'技巧',所以可以用其他語言編寫。 Function overloading by return type?

+1

爲什麼不給他們不同的名字? –

+0

您正確地說,您試圖做的事情在Java中是不允許的,所以我建議您重新編寫代碼以避免這種情況。在您的情況下,編譯器或開發人員無法知道在任何給定的調用中哪個方法將甚至應該被調用。不要尋找解決方法,只是不要這樣做。 –

回答

2

重命名其中一種方法。如果methodA返回的信息與methodB不同,即使返回類型相同,也沒有語法或設計原因,它們都應該被稱爲methodA。如果你處於絕對需要它的方式,那麼你應該添加一個參數,讓你指定你需要的功能。

+0

upvoted:我完全同意 – fantaghirocco

1

也許這與您的案例不完全匹配,但可以使用一個或多個interface獲得與您的問題類似的內容。

在通過get(String s)方法調用所返回的對象下面的代碼是一個接口類型,並且可以被綁定到其代表的結果類型的類。

//result type 
interface IIinterface0 { 
    void someMethod(); 
} 

interface IIinterface1 { 
    IIinterface0 get(String s); 
} 

class ClassA0 implements IIinterface0 { 
    @Override 
    public void someMethod() { 
    } 
} 

class ClassA1 implements IIinterface0 { 
    @Override 
    public void someMethod() { 
    } 
} 

class ClassA implements IIinterface1 { 
    @Override 
    public IIinterface0 get(String s) { 
     IIinterface0 obj = new ClassA0(); 
     System.out.println(s + " " + obj.getClass().getName()); 
     return obj; 
    } 
} 

class ClassB implements IIinterface1 { 
    @Override 
    public IIinterface0 get(String s) { 
     IIinterface0 obj = new ClassA1(); 
     System.out.println(s + " " + obj.getClass().getName()); 
     return obj; 
    } 
} 

public class Test { 

    public static void main(String[] args) { 

     String s = "myString"; 

     IIinterface1 objectA = new ClassA(); 
     objectA.get(s); 

     IIinterface1 objectB = new ClassB(); 
     objectB.get(s); 
    } 
} 

上面打印:

的myString ttest.ClassA0
的myString ttest.ClassA1

1

沒有特技。正如你所提到的,這是java語言規範所禁止的。這種限制BTW是從C++繼承,並從返回方法的值可以被忽略的事實得出,即你可以叫

GET(「富」)

的2種get()方法預計將是現在執行?我們不知道,也不知道。

然而,典型的解決方案存在。你可以定義1個方法如下:

T get(String arg,Class type);

現在你不需要鑄造。你可以調用

String s = get("foo", String.class); 

Integer i = get("bar", Integer.class); 

現在的問題是在於實施。您可以 1.作家的if-else鏈(醜陋的,但簡單的解決方案) 2.委託執行存儲在地圖小實施者,即

interface Get<T> { 
    public T get(String arg); 
} 


class StringGet implements Get<String> { 
    public String get(String arg) {....} 
} 

class IntegerGet implements Get<Integer> { 
    public Integer get(Integer arg) {....} 
} 


......................... 

private Map<Class<?>, Get<?>> getters = ................; 

噸得到(字符串阿根廷,類型){ 回報( T)getters.get(類型)獲得(ARG); //鑄造必須在這裏...... }