【发布时间】:2021-03-15 10:42:29
【问题描述】:
我正在将代码从 java 迁移到 kotlin,但泛型存在一些问题。
这是一个解释我的疑惑的例子:
import java.util.*
import kotlin.collections.HashMap
interface MyGenerics<T>{
fun produce():T
fun publish(toPublish:T):String
}
class MyImplementation:MyGenerics<Boolean>{
override fun produce(): Boolean {
return true
}
override fun publish(toPublish: Boolean): String {
return "test"
}
}
class RegistrationClass{
private val workers = HashMap<String, Vector<MyGenerics<Any>>>()
fun register(type: String, worker: MyGenerics<Any>) {
if (!workers.containsKey(type)) workers[type] = Vector()
workers[type]!!.add(worker)
//usage example
for (workers in workers[type]!!){
val product = workers.produce()
workers.publish(product)
}
}
}
fun main() {
val registrationClass = RegistrationClass()
registrationClass.register("MyTest", MyImplementation()) //error kotlin implementation
val javaRegistrationClass = JavaRegistrationClass()
javaRegistrationClass.register("MyNewTest", MyImplementation()) //java implementation
}
为什么我会出错
> registrationClass.register("MyTest", MyImplementation()) //error
> kotlin implementation
而不是:
javaRegistrationClass.register("MyNewTest", MyImplementation()) //java implementation
这是 JavaRestristrationClass:
class JavaRegistrationClass{
private HashMap workers = new HashMap<String, Vector<MyOtherTest>>();
public void register(String type, MyGenerics worker) {
//do something
}
}
我已经阅读了这个https://stackoverflow.com/a/65534086/3681634 的答案,但我仍然不明白
【问题讨论】:
-
注册需要
MyGenerics<Any>,你不能将MyGenerics<Boolean>传递给它。在 java 中,您使用的是 kotlin 不支持的原始类型。您的代码在 Java 中不是类型安全的,因此您需要更改一些内容以使其在 Kotlin 中工作。如果没有看到您的其余代码,很难就此提出建议。 -
嗨!谢谢;)我已经用一个用法示例编辑了这个问题。像这样: /*用法示例*/ for (workers in workers[type]!!){ val product = workers.produce() workers.publish(product) }