java - 如何返回参数化返回类型的子类,其参数类型是返回类型参数类型的子类?

标签 java generics java-6 parameterized-types

标题听起来有点复杂,但其实问题很简单。 我有以下方法:

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/

相关文章:

java - 具有多个主类的带有 kotlin DSL 的 Gradle 应用程序插件

java - 在 Eclipse 中将 Java 类集成到 PyDev 项目 (Jython)

使用循环和 key 进行 Java 加密?

java - 使代码与 java 1.6 兼容(-source 1.6 不支持 try-with-resources)

java - 如何使 Tomcat 部署的文件在上下文中免于缓存在浏览器中?

java - 如何在 Java 中执行 `MyClass<String>.class`?

java - 如何编写接受堆栈和队列的方法?

java - 由于名称冲突无法重写方法

java - 在哪里可以找到 Java native 方法实现?

ssl - TLSv1.2+BouncyCaSTLe+Apache httpclient 4.4