我正在尝试使用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>,所以这不会编译.
我想知道的是:是否有可能援引一些仿制药的魔法,这样编译器选择通用型T在getObject参与上述函数调用父类,即A?
非常感谢!
您可以做的一件事是将声明更改为如下所示:
// (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或进行澄清评论。
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |