如何在 Java 中返回泛型子类的实现

问题描述 投票:0回答:1

我有以下结构:

    class Base{}
    class Extension1 extends Base{}
    class Extension2 extends Base{}
    abstract class AbstractClazz<T extends Base>{}
    class Clazz1 extends AbstractClazz<Extension1>{}
    class Clazz2 extends AbstractClazz<Extension2>{}

    <T extends Base>  AbstractClazz<T> method(boolean returnClass1){
        if (returnClass1){
          return new Clazz1();
        }
        return new Class2();
    }

但是,我的编译器给我一个错误,指出“无法从 Clazz1 转换为 AbstractClazz”。 我不知道为什么会发生这种情况。据我了解,

Clazz1
Clazz2
满足
AbstractClazz<T extends Base>
实例的要求,因为
Clazz1
Clazz2
AbstractClazz
的实现,其中泛型类型是
Base
的子类,这正是
AbstractClazz<T extends Base>
所期待的。

我该如何解决这个问题?

注意:我的代码是使用 Java 8 编写的。

java generics inheritance java-8
1个回答
0
投票
<T extends Base>  AbstractClazz<T> method(boolean returnClass1){

<T extends Base>
这样的类型参数在很多方面都像
boolean returnClass1
:调用者选择它们。

例如,调用者可以写

class MyRandomExtensionOfBase extends Base{}

AbstractClazz<MyRandomExtensionOfBase> thingy = Foo.<MyRandomExtensionOfBase>method(true);

...这应该有效。

那不是你所拥有的。 你有一个返回

AbstractClazz<? extends Base>
的函数,返回 some
AbstractClazz<T>
对于某些
T extends Base
method
的实现决定。

您必须返回该类型才能进行类型检查。

© www.soinside.com 2019 - 2024. All rights reserved.