Java 如何将泛型类映射到Kotlin中相同类的泛型数组
我想知道,如何将泛型类映射到Kotlin中相同类型的泛型数组 给定以下类别:Java 如何将泛型类映射到Kotlin中相同类的泛型数组,java,kotlin,generics,Java,Kotlin,Generics,我想知道,如何将泛型类映射到Kotlin中相同类型的泛型数组 给定以下类别: class MyClass(val类型:class){ fun new()=type.newInstance() } 我想要一些类似于: class-MyOtherClass{ val map=map 内联fun get():MyClass{ if(映射中的T::class.java){ 返回映射[T::class.java] }否则{ val newInstance=MyClass(T::class.java) m
class MyClass(val类型:class){
fun new()=type.newInstance()
}
我想要一些类似于:
class-MyOtherClass{
val map=map
内联fun get():MyClass{
if(映射中的T::class.java){
返回映射[T::class.java]
}否则{
val newInstance=MyClass(T::class.java)
map[T::class.java]=newInstance
返回新实例
}
}
}
但是,这不起作用,因为:
- T不能在MyOtherClass中使用
- 在MyOtherClass中将T更改为Any将抛出一个类型推断错误,Any是必需的,但我们有T
- 更改为out Any也不起作用
- 更改为确实有效,但会发出警告,“return map[T::class.java]”是未经检查的强制转换
- 拥有一个泛型管理器类,该类对给定类型(=上面的MyClass)执行某些操作
- 拥有另一个按类型缓存此类管理器类的类。如果存在给定类型的管理器,则应使用该管理器,而不是创建新的管理器
- 因此,我想将一个类型映射到同一类型的管理器
class-MyOtherClass{
val map=map
内联fun get():MyClass{
if(映射中的T::class.java){
将map[T::class.java]作为MyClass返回
}否则{
val newInstance=MyClass(T::class.java)
map[T::class.java]=newInstance
返回新实例
}
}
}
谢谢大家的帮助 正如Lino在开篇文章中提到的,没有警告是不可能的,因为一般信息T丢失了 此外,*可以在Kotlin中用作通配符,因此以下方法正在发挥作用(取自实际代码):
inline fun componentManager():componentManager=componentManager(T::class.java)
@抑制(“未选中的_CAST”)
fun componentManager(类型:类):componentManager{
何时返回{
ComponentManager.containsKey(类型)->{
ComponentManager[类型]作为ComponentManager
}
其他->{
val管理器=组件管理器(initialEntityCapacity,类型)
addListener(管理器)
ComponentManager.put(类型,管理器)
经理
}
}
}
多亏了利诺 将映射更改为
val map=mutableMapOf()
,然后在方法中将映射[T::class.java]返回为MyClass
,以便于快速回复!你没有收到未经检查的演员的警告吗?至少这是我得到的,但也许我做了一些不同于你的事情,什么是“*”?我只知道Kotlin中的任何东西。*
是一个通配符,因此您不知道自己在使用什么。而未经检查的强制转换是一种后果,据我所知,您无法绕过警告是合法的,因为它不再具有编译时类型安全性。您必须确保只存储有意义的映射,然后才能抑制警告。你基本上是在告诉工具“我知道我在这里做什么,这是安全的。”谢谢你们!明天我会写一个清晰的答案,然后结束它