Kotlin - 泛型继承的返回类型

时间:2021-03-01 22:42:50

标签: kotlin generics inheritance gson

我有一个通用的父类:

 open class Parent<T>{/*...*/}

我有一些派生类实现了通用父类的特定实例:

class Derived1 : Parent<Foo1> {/*...*/}
class Derived2 : Parent<Foo2> {/*...*/}

其中 Foo1 和 Foo2 是在别处定义的一些类

我现在需要创建一个基于某些输入参数返回不同派生类的函数:

fun getDerived(derived: SomeEnumType): Parent{
    //return the correct derived class
}

当然上面的行不会编译,因为 Parent 需要一个通用参数。派生类的类型不同,所以我不希望能够多态地处理这个问题。我怎样才能做到这一点?我对 kotlin 很熟悉。不过这似乎是作弊。

如果有帮助,我将使用此模式在正确的子类中使用 gson 库解析 json(通过覆盖反序列化器)

1 个答案:

答案 0 :(得分:1)

您可以使用 Parent<*> 但如果 Foo1Foo2 之间存在关系(例如扩展通用接口 Buzz),那么您可以使用类似Parent<out Buzz>

IIRC,<*> 就像 Java 的通配符 <?>。不限制响应类型将意味着您需要在函数 getDerived 的调用点使用一些类型保护以使响应可检查。