类泛型 - 决定返回类型的方法内部

时间:2017-11-20 11:24:40

标签: java generics

这可能是一个愚蠢的问题但是..让我说我有一些方法。此方法可能具有泛型返回类型(或不具有),但是..我希望此方法将决定返回哪个类。这意味着在调用方法时不知道它。例如:

public <U> SomeWrappingClass<U> execute() {
  if (..) return new SomeWrappingClass<Foo>();
  else return new SomeWrappingClass<Bar>();
}

SomeWrappingClass c = obj.execute();
c.barMethod() // in case of SomeWrappingClass<Bar> returned
c.fooMethod() // in case of SomeWrappingClass<Foo> returned

我想它不能像那样工作,并且在方法调用时必须知道类型。也许只能通过返回对象的某个成员,或者通过使用泛型作为方法参数调用Runnable?例如

public SomeReturnObject execute() {
  SomeReturnObject o = new SomeReturnObject();
  if (..)
    o.returnObj = new SomeWrappingClass<Foo>(); 
  else 
    o.returnObj = new SomeWrappingClass<Bar>(); 
}

现在我可以在SomeWrappingClass的情况下调用o.returnObj.barMethod()

编辑:ResultObject也不是解决方案,(至少ResultObject与泛型如ResultObject&lt; T&gt;)因为它与没有它的情况相同)..所以..除非以某种方式返回类..所以调用者将知道这个班级..但是那不可能再用例如Class&lt; T>因为必须在通话时知道。

1 个答案:

答案 0 :(得分:2)

所有关于泛型的事情只在编译时才有意义,而不是在运行时。

因此,如果在编译时您不知道它是env :PATH, ENV['PATH'] env :GEM_PATH, ENV['GEM_PATH'] 还是SomeWrappingClass<Foo>,那么您必须声明与这两种情况相匹配的公分母,例如亚历山大的建议SomeWrappingClass

或者,如果你有一个Foo和Bar的公共超类或接口,那么你可以使用SomeWrappingClass<Bar>

当然,您的来电者不会知道它是SomeWrappingClass<? extends SuperFooBar>还是SomeWrappingClass<Foo>,不是在编译时也不是在运行时。因此,如果它对您的来电者的逻辑产生影响,您必须为他提供一种区分方式(但那是一个&#34;代码气味&#34;)。

另一种可能性:

引入子类SomeWrappingClass<Bar>FooWrappingClass extends SomeWrappingClass<Foo>并返回这些类的实例。然后你可以在那里放置特定的行为。