这可能是一个愚蠢的问题但是..让我说我有一些方法。此方法可能具有泛型返回类型(或不具有),但是..我希望此方法将决定返回哪个类。这意味着在调用方法时不知道它。例如:
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>因为必须在通话时知道。
答案 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>
并返回这些类的实例。然后你可以在那里放置特定的行为。