2013-03-19 151 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