kotlin - 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(通过覆盖反序列化器)
解决方案
你可以侥幸逃脱,但如果和Parent<*>
之间存在关系(例如扩展一个通用接口,),那么你可以使用类似.Foo1
Foo2
Buzz
Parent<out Buzz>
IIRC,<*>
就像 Java 的通配符<?>
。不限制响应类型意味着您需要在函数的调用站点使用一些类型保护,getDerived
以使响应可检查。
推荐阅读
- c++ - 无法将函数指针作为函数参数传递
- sql - 授予通过 database_link 选择同义词
- flutter - Dart/Flutter 中 BLoC 模式的最佳实践
- c# - 我应该如何在我的项目中引用一个文件,所以当我发布应用程序时,该文件是在特定文件夹中生成的?
- python - 具有相同架构的 Keras 和 Pytorch 代码之间的区别
- notepad++ - Notepad++ 正则表达式 [^az] 未返回预期的匹配项
- python - Arduino 和树莓派 4 之间的蓝牙通信
- sql - 使用多个 with 优化慢查询
- airflow - 如何在 Airflow 中使用 last_mod_dt(时间戳)从 oracle 数据源中执行每小时增量提取?
- sql - 如何将查询转换为使用联接?