Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将泛型类映射到Kotlin中相同类的泛型数组_Java_Kotlin_Generics - Fatal编程技术网

Java 如何将泛型类映射到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

我想知道,如何将泛型类映射到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)
map[T::class.java]=newInstance
返回新实例
}
}
}
但是,这不起作用,因为:

  • T不能在MyOtherClass中使用
  • 在MyOtherClass中将T更改为Any将抛出一个类型推断错误,Any是必需的,但我们有T
  • 更改为out Any也不起作用
  • 更改为确实有效,但会发出警告,“return map[T::class.java]”是未经检查的强制转换
我不知道如何写,也不知道你是否能写,但从逻辑的角度来看,我希望实现以下目标:

  • 拥有一个泛型管理器类,该类对给定类型(=上面的MyClass)执行某些操作
  • 拥有另一个按类型缓存此类管理器类的类。如果存在给定类型的管理器,则应使用该管理器,而不是创建新的管理器
  • 因此,我想将一个类型映射到同一类型的管理器
如前所述,我有一种方法可以编写它,如下所示,但我希望避免使用强制转换警告,因为我认为它无效,因为映射应该告诉编译器获取X类型的内容将返回X类型的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中的任何东西。
*
是一个通配符,因此您不知道自己在使用什么。而未经检查的强制转换是一种后果,据我所知,您无法绕过警告是合法的,因为它不再具有编译时类型安全性。您必须确保只存储有意义的映射,然后才能抑制警告。你基本上是在告诉工具“我知道我在这里做什么,这是安全的。”谢谢你们!明天我会写一个清晰的答案,然后结束它