【问题标题】:Kotlin generics and wrong type inferenceKotlin 泛型和错误的类型推断
【发布时间】:2017-06-06 08:20:25
【问题描述】:

考虑一个通用的class Item 和继承它的特定class Event

open class Item<T> {
    fun copyFrom(item: T) {
        if (this is Event && item is Event) {
            owner = item.owner
            value = item.value 
        }
    }
}

class Event : Item<Event> {
    open var owner = ""
    open var value = 0
}

由于类型推断,我们不必将 Item 转换为 Event,我们可以直接访问 ownervalue。但是它说itemT 类型,不能在item is Event 子句中转换为Event。我认为这不应该发生,因为这个子句在 Java 中是正确的?

编辑:

我知道copyFrom 的实现应该在Event 中完成,但这只是为了演示类型推断问题。

【问题讨论】:

  • 我认为除了缺少括号class Event : Item&lt;Event&gt;()之外没有任何编译错误,您使用的是哪个版本?确切的错误信息是什么?
  • class Event : Item&lt;Event&gt; {行添加缺少的构造函数调用后无法重现
  • 它不是类型推断的一部分,它是 smartcast
  • 请说明您到底遇到了什么错误。现在,我正在标记这个问题。
  • 感谢您的接受 :-)

标签: generics kotlin


【解决方案1】:

即使你解决了句法问题:不要这样做。

您正在创建一个通用容器,它显式检查是否有不同的子类进入。然后执行向下转换并访问子类中的字段。

这与好的 OO 设计完全相反。您的基类应该对任何子类一无所知

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多