Java 返回泛型类类型

Java 返回泛型类类型,java,class,generics,Java,Class,Generics,我有一个可能返回类a或类B的方法。如何将其返回类型定义为泛型,与返回的类类型无关。例如 public <Generic_Class_Return_Type> showForm() { if (true) return new ClassA(); else return new ClassB(); } publicshowform(){ 如果(真) 返回新的ClassA(); 其他的 返回新的ClassB(); } 您可以使用两个类实现的接口,如

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

public <Generic_Class_Return_Type> showForm() {
   if (true)
      return new ClassA();
   else 
      return new ClassB();
}
publicshowform(){
如果(真)
返回新的ClassA();
其他的
返回新的ClassB();
}

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

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

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


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

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 { }

仿制药


如果您想使用泛型,那么
ClassA
ClassB
需要是同一个类,由一些泛型类型修改,例如
Class
。泛型是否相关取决于类的实现。您可能最好使用接口或基类。

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

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

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

但是,如果您指定了您的用例,我们可以进一步建议是否使用泛型,或者您最好使用标准多态性。

将相同的接口添加到类中,返回接口一种方法就是只返回对象。但是我想知道是否有更通用和更适合使用公共对象showForm(){if(true)return new ClassA();else return new ClassB();}谢谢。但是我认为Java泛型中有一些东西可以处理这个问题?不,没有泛型返回类型。您可以将包含方法的类设置为泛型,并使该函数返回泛型类型,但如果无法使用类型变量作为返回类型List.get(int),则您将拥有一个超类或接口bot ClassA和ClassB派生自/实现不能返回一个T,你必须一直输入一个小的打字错误:
klass
vs
clazz
(我希望世界会采用
class
someClass
作为惯例)谢谢,实际上有很多打字错误。第一次从电话发帖(我真的很遗憾!)顺便说一句,应该至少有一个未经检查的演员阵容,不确定它是否编译在那里做过。。。从电话发帖真是太难了!谁来创建一个更简单的应用程序??!?不确定应用程序是否足够。一个有用的答案通常需要指向外部资源的链接,并且代码应该在发布之前运行,但是这项任务在移动设备上是困难的,甚至是不可能的。我只是忍不住要回答这个问题:P,但无可否认,这是一个微不足道的问题,尽管如此,总体质量还是相当低的。尽管如此,希望它能有所帮助,因为没有其他人发布带有泛型的示例
public <T> T getForm() {
  Class<T> clazz = (Class<T>) ((true) ? Foo.class : Bar.class);
  Constructor<T> ctor = clazz.getConstructor();
  return ctor.newInstance();
}