由于将通用Java代码重构为Kotlin更加严格,因此我很难。我不知道在这种情况下该怎么办。
首先,我有interface TopicController
的抽象订阅方法,其中一些包含参数type: Class<T>
。在这里,<T>
应该实现类Message
。 (<T: Message>
)
我还有一个TopicController的实现,即TopicControllerImpl
。此类具有节点列表:val nodes: MutableList<TopicNode<T>>
。同样在这种情况下,T
应该实现Message
。
为此,我正在尝试将实现定义附加到类似TopicControllerImpl<T : Message>
的类上。但是,TopicController
中的函数也需要具有此实现符号,并且不能从TopicControllerImpl
派生。
反之亦然,因此使用interface TopicController<T : Message>
迫使我为Message
定义TopicController
,因此:class TopicControllerImpl(args) : TopicController<*One type argument expected for interface TopicController<T : Message>*>
。
请注意:以下代码不能成功编译:
TopicControllerImpl
class TopicControllerImpl<T: Message>/** ?? */(*[args]*) : TopicController {
private val nodes: MutableList<TopicNode<T>>
override fun subscribe(topic: String, type: Class<T>, subscriber: Messenger) {
val node = findOrCreateNode(topic, type)
node.addListener(subscriber)
}
private fun findOrCreateNode(topic: String, type: Class<T>): TopicNode<T> {
var node = findNode<T>(topic)
if (node != null) {
return node
}
// If node doesn't exist yet, create it, run it and add it to the collection
node = TopicNode(topic, type)
executor.execute(node, configuration)
nodes.add(node)
return node
}
// other functions...
}
TopicController
interface TopicController<T : Message>{ /** ?? */
fun subscribe(topic: String, type: Class<T>, subscriber: Messenger)
// Other methods
}
所以我想知道如何解决它以便成功编译...希望我有点清楚,如果您有任何疑问,请询问更多细节。
答案 0 :(得分:1)
按照kotlin中的类型推断,如果您的父级使用通配符类型作为类表示形式,则在从子级继承它们时需要提供它(在Java中也是一样。)
在这种情况下,您的TopicController
属于T
类型,具有Message
作为反射。
因此,当您从中继承(或扩展)时,意味着在子类或接口上实现时,您必须明确提供它。
看下面的例子:
interface Parent<T : SomeClass> { // Parent can be an abstract class too
// Some methods
}
然后在任何孩子身上实现它
class Child<T: SomeClass> : Parent<T> // We'll need to define T here for parent as it's unknown while inheriting
{
// Some overridden methods
}