java - 如何将 TBase 列表转换为 TChild 列表,其中 TChild : TBase using KClass?
问题描述
我有一个列表TBase
,我知道是TChild
, where的列表TChild : TBase
。如果我只有,是否可以KClass<TChild>
投到?List<TBase>
List<TChild>
fun <TChild : BaseType> castList(list: List<BaseType>, clazz: KClass<TChild>): List<TChild> {
// is this possible?
}
我知道如果List
不参与,我可以将一个实例TBase
转换为TChild
:
clazz.cast(item)
我正在尝试做的事情可能吗?寻求避免具体化的解决方案。
解决方案
如果您确实确定它TChild
仅包含对象并且在强制转换后不会向其添加任何其他对象(List
只读,不是不可变的),那么您可以像这样进行未经检查的强制转换:
fun <TChild : BaseType> castList(list: List<BaseType>, clazz: KClass<TChild>): List<TChild> {
@Suppress("UNCHECKED_CAST")
return list as List<TChild>
}
如果您更喜欢在投射时实际检查项目类型,请执行以下操作:
fun <TChild : BaseType> castList(list: List<BaseType>, clazz: KClass<TChild>): List<TChild> {
return list.map { clazz.cast(it) }
}
请注意,第二个解决方案会创建列表的副本,因此这不完全是强制转换。如果您打算在转换后修改原始列表,这一点很重要,因为正如我所说,List
它不是不可变的,而是只读的。
推荐阅读
- snowflake-cloud-data-platform - 确定相交记录的数量
- excel - Excel 到 XML 嵌套元素
- linux - systemd 不会从 bash 脚本运行应用程序
- .net - 从命令行运行 asp.net core 5 api 时使用哪些端口?
- python - 逻辑回归 - 如何拟合具有多个特征的模型并显示系数
- discord - Discord Bot 读取 Google 表格并在表格中返回值。我想在没有表格格式的消息中返回值 ar CSV
- c# - c# - 如何将JSON对象列表序列化到文件中,而不是数组
- java - 无法将 FBX 转换为 G3DJ
- python - 按时间戳合并熊猫数据帧
- javascript - 作为(构造函数)函数的参数的扩展运算符是否总是会产生一个数组,如果是,为什么?