Java Generics:返回泛型类的对象,其类型参数是参数T的超级

use*_*992 5 java generics

我正在尝试使用Java泛型来完成某些事情,并且由于类型擦除,因为我本能地采用的方法在这种语言中不起作用,所以我有一段时间.但是,如果我得到以下工作,我可以将一些合理的东西拼凑在一起.我有两节课:

class A {}

class B extends A {}
Run Code Online (Sandbox Code Playgroud)

第三类:

class C<T extends A> {}
Run Code Online (Sandbox Code Playgroud)

我想要一个通用的工厂方法,它将返回一个实例C,如果我给它一个A或的实例B.第一次尝试可能如下所示:

<T extends A> C<T> getObject(T t) { ... }
Run Code Online (Sandbox Code Playgroud)

我认为这个问题不是很独特,最容易通过以下方式解释:

B b = new B();
C<A> = getObject(b);
Run Code Online (Sandbox Code Playgroud)

我定义getObject的方式,上面的调用将返回一个类型的对象C<B>,该对象不是C<A>也不是继承C<A>,所以这不会编译.

我想知道的是:是否有可能援引一些仿制药的魔法,这样编译器选择通用型TgetObject参与上述函数调用父类,即A?

非常感谢!

Rad*_*def 2

您可以做的一件事是将声明更改为如下所示:

// (I've deviated from Java generic naming convention for clarity)
<TRet extends A, TArg extends TRet> C<TRet> getObject(TArg arg) { ... }
Run Code Online (Sandbox Code Playgroud)

所以现在返回类型和参数类型是独立推断的:

  • TRet根据返回值的赋值类型推断。
  • TArg是根据参数的类型推断的。

TArg仍然必须是TRet或 的子类TRet。(或者从另一个方向看它,TRet必须是TArg或 的超类TArg。)

虽然我认为这有点考验。此外,评论中已经提到单数类型版本可以在 Java 8 上编译。

但是这个:

不过,如果我能做到以下几点,我就可以拼凑出一些合理的东西。

有点让我想知道。您似乎描述了尝试的解决方案,但没有描述实际的问题,这让我想知道我们的建议是否真的有帮助。如果是,那就太好了,但如果不是,请毫不犹豫地编辑OP或进行澄清评论。