generics - 使用子类类型参数覆盖泛型函数
问题描述
我在 kotlin 中有以下接口,不可修改,因为它是在第三方库中定义的。我想使用子类的类型参数覆盖泛型方法:
interface Factory {
fun <T> create(modelClass: Class<T>): T
}
// The naive solution doesn't compile : "Class is not abstract and does not implement abstract member":
class ConcreteFactory1 <T> (val creator: () -> T) : Factory {
override fun create(modelClass: Class<T>): T {
return creator()
}
}
// If we introduce a second type parameter, it compiles, but generates a "Unchecked Cast" warning:
class ConcreteFactory2 <T> (val creator: () -> T) : Factory {
override fun <T2> create(modelClass: Class<T2>): T2 {
return creator() as T2
}
}
有没有办法在没有编译警告的情况下实现这一点?
解决方案
这取决于。该接口要求您能够处理任何可能性Class<T>
,而您的实现则不能。
create
所以问题是当用一种不是你ConcreteFactory2
可以创建的类型调用时你想做什么?
如果您唯一想要的不是看到未经检查的演员表,您可以这样做:
class ConcreteFactory2 <T> (val creator: () -> T) : Factory {
override fun <T2> create(modelClass: Class<T2>): T2 {
return creator() as? T2 ?: throw IllegalArgumentException("unsupported type")
}
}
但是,这是否是该接口的可接受实现真的取决于它是如何使用的。
推荐阅读
- python - 如何在 Google Cloud Datalab 中使用 Python 3.8?
- spring - 无法在 Jenkins 共享库中使用 org.springframework.web.util.UriComponentsBuilder 版本 5.2.13.RELEASE
- docker - Docker 容器离线,即使重启策略总是
- css - 背景过滤器:不透明度()似乎不起作用
- r - 具有按其类标签分类的数据点的热图
- javascript - Joi:如何验证 2 个数组完全不同
- ssis - 通过从 excel 获取输入来创建一个 SSIS 包以运行一些存储过程
- flutter - 从 flutter app 发布数据时出现此错误。未处理的异常:FormatException:无效的 radix-10 数字(在字符 1)
- azure-devops - Azure 板:项目中的新项目与新团队 - 权衡取舍是什么?
- javascript - 如何防止第三方在 javascript 中滥用我的 api?