繁体   English   中英

返回通用类类型

[英]Return generic class type

我有一个可能返回Class A或Class B的方法。如何将其返回类型定义为泛型,而与返回的类类型无关。 例如

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

不太确定在这种情况下是否需要泛型,但是可以对整个类或仅对方法进行参数化,然后像这样使用反射:

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

但是,如果您指定用例,我们可以进一步建议使用通用方法还是最好使用标准多态性。

您可以使用两个类都实现的接口,如下所示:

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

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

要么

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

最简单的方法是将它们作为对象返回。

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> 泛型是否相关都取决于类的实现。 您最好是使用接口或基类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM