首页 > 解决方案 > Kotlin - 泛型继承的返回类型

问题描述

我有一个通用的父类:

 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.Any 但这似乎是作弊。

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

标签: kotlingenericsinheritancegson

解决方案


你可以侥幸逃脱,但如果和Parent<*>之间存在关系(例如扩展一个通用接口,),那么你可以使用类似.Foo1Foo2BuzzParent<out Buzz>

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


推荐阅读