【问题标题】:Kotlin type mismatch with genericsKotlin 类型与泛型不匹配
【发布时间】:2017-05-06 23:48:04
【问题描述】:

我最近遇到了一个关于安全导航运算符 (?.) 和泛型的问题。

class A<T : Any?>(private var value: T) {
    fun function() {
        value?.let { 
            val notNull: Any = it
            //                 ^^
            // Type mismatch: 
            // Required: Any
            // Found:    T
        }
    }
}

我相信上面的代码运行应该没有问题,但它会产生上面显示的错误。我错过了什么吗?

【问题讨论】:

  • 尽管传递给 let 的块只有在值不为空时才会执行,it 在块内仍然是 T 类型。所以你可以将 is 赋值给 Any? 类型的变量,但不能赋值给 Any 类型的变量。
  • @JBNizet 所以我可以确定它不为空并直接转换它吗?
  • 是的,你可以这样做。但我真的不明白为什么你的方法是通用的。
  • 你可以这样定义你的类:class A&lt;T : Any&gt;(private var value: T?)
  • @marstran 没有想到这一点。谢谢!

标签: generics kotlin nullable


【解决方案1】:

我认为您在示例中遗漏了一些内容以得到该错误。所以我要猜测你真正想要达到的目标,如果我误解了你的意图,请原谅我。

class A<T : Any>(private val value: T?) { // T? instead of T to allow null value
  fun function() {
    value?.let {
      // *it* is already a non-null because you did a ?.let on a T? type
    }
  }
}

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多