标题听起来有点复杂,但其实问题很简单。 我有以下方法:
AbstractClassA<AbstractClassB> myMethod() {...}
我想像这样调用它:
ClassAImpl<ClassBImpl> result = myMethod();
问题是,无论我尝试什么,我最终都会得到 unchecked cast警告或编译器错误。
正确的做法是什么?
最佳答案
这一切都取决于。最简单的答案是,您只需要转换 myMethod
的结果即可。与结果类型相同。假设我们将所有泛型从问题中剔除,如下所示:
public class Demo {
private abstract class AbstractClassA {}
private class ClassAImpl extends AbstractClassA {}
private abstract class AbstractClassB {}
private class ClassBImpl extends AbstractClassB {}
Demo() {
ClassAImpl result = myMethod();
}
public AbstractClassA myMethod() {
return new ClassAImpl();
}
public static void main(String[] args) {
new Demo();
}
}
调用myMethod
仍然是编译器错误,因为类型不匹配。思考这个问题的一个好方法是想象您对 myMethod
正文中的代码一无所知。 。你怎么知道它返回 ClassAImpl
而不是 AbstractClassA
的其他子类型?因此,要使其正常工作,您需要调用 myMethod
像这样:
ClassAImpl result = (ClassAImpl)myMethod()
对于泛型位,您可能希望方法签名类似于:
public AbstractClassA<? extends AbstractClassB> myMethod()
但也许想要类似的东西:
public AbstractClassA<ClassBImpl> myMethod()
甚至:
public ClassAImpl<ClassBImpl> myMethod()
除了最后一个之外的所有内容都需要一些显式转换。
关于java - 如何返回参数化返回类型的子类,其参数类型是返回类型参数类型的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971246/