2013-03-19 149 views
0

我有一個方法可能會返回A類或B類。如何定義它的返回類型爲泛型的,與返回的類類型無關。對於例如返回泛型類型

public <Generic_Class_Return_Type> showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 
+1

添加相同接口的類,返回接口 – 2013-03-19 00:53:00

+0

一種方法是隻返回對象。但我想知道是否有更多的東西通用的,適合使用 公共對象showForm(){ 如果(真) 返回新ClassA的(); else return new ClassB(); } – 2013-03-19 00:53:57

回答

0

你可以使用一個接口,這兩個類實現這樣的:

public SomeInterface showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

class ClassA implements SomeInterface{} 
class ClassB implements SomeInterface{} 
+0

謝謝。但是我認爲Java泛型中有一些東西可以處理這個問題? – 2013-03-19 00:55:45

+0

不,沒有通用的返回類型。您可以使包含方法的類爲泛型,並使該函數返回泛型類型,但是您將擁有一個SuperClass或一個接口bot類ClassA和ClassB派生自/實現 – ITroubs 2013-03-19 00:57:20

+0

如果無法使用類型變量作爲返回類型,清單獲得(INT)無法返回T和你不得不施展所有的時間 – Raffaele 2013-03-19 01:05:52

0
public object showForm() 
{ 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

public superClassName showForm() 
{ 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 
0

最簡單的方法是將它們作爲對象返回。

public Object showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

雖然它不是很有用,但更有用的解決方案是讓它們擴展一個通用類或實現一個通用接口。

public CommonInterface showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

class ClassA implements CommonInterface { } 
class ClassB implements CommonInterface { } 
interface CommonInterface { } 

或者

public CommonClass showForm() { 
    if (true) 
     return new ClassA(); 
    else 
     return new ClassB(); 
} 

class ClassA extends CommonClass { } 
class ClassB extends CommonClass { } 
class CommonClass { } 

泛型

如果你想使用泛型然後ClassAClassB將需要同一類,由一些通用的類型如修改。 Class<T>。泛型是否相關都取決於你的類的實現。你可能最好使用接口或基類。

1

不能確定是否需要仿製藥在這種情況下,但是可以參數化或者全班或只是方法,然後使用反射像這樣:

public <T> T getForm() { 
    Class<T> clazz = (Class<T>) ((true) ? Foo.class : Bar.class); 
    Constructor<T> ctor = clazz.getConstructor(); 
    return ctor.newInstance(); 
} 

但是如果你指定你的使用情況,我們可以進一步提示是否要採用泛型,或者如果你最好使用標準多態。

+0

一點點錯字:'klass' VS'clazz'(我希望這個世界會採用'theClass'或'SomeClass的'作爲慣例) – jahroy 2013-03-19 01:07:12

+0

謝謝,實際上有很多錯別字。第一次從電話發佈(真的很後悔!)順便說一句,至少應該有一個未經檢查的演員陣容,不知道它是否編譯完成 – Raffaele 2013-03-19 01:12:04

+0

在那裏做過...從電話發佈是很難的!誰會創建使它更容易的應用程序??!? – jahroy 2013-03-19 01:13:55