类型不匹配;找到“消息”,必填“ T”

时间:2019-04-17 11:52:29

标签: generics kotlin abstract-class

在我的代码中,我有一个方法publishMessage,它需要从类Message扩展的类型。在此方法中,调用publish,其类型为message的{​​{1}}。

这将导致错误>类型不匹配;找到T,必填Message

这是否与T有关,而该T是使用方法声明的类Message的扩展?我不明白为什么无法做到这一点。

在我看来,类型为T的参数可以是任何

  

Myclass

fun <T : Message> publishMessage(topic: String, type: Class<T>, message: Message) {
    val node = findOrCreateNode(topic, type)
    node.publish(message) // Type mismatch; found `Message`, required `T` .
}
  

节点类

fun publish(message: T) {
   // Implementation
}

1 个答案:

答案 0 :(得分:1)

  

在我看来,T类型的参数可以是任何东西

是的,可以是任何东西,但是编译器希望确保您的类型没有问题。因此,您必须像这样创建Node<Message>()的Node对象,或者将publishMessage的方法签名更改为fun <T : Message> publishMessage(topic: String, type: Class<T>, message: T)。在这种情况下,编译器可以保证类型安全,并且错误将消失。