kotlin - 即使支持字段可以为空,getter 也会返回不可为空的类型

标签 kotlin nullable getter non-nullable

num设置时应该可以为空,但它返回的内容应该始终不可为空(具有默认值)。

class Test {
    var num: Int? = null
        get() = field ?: 5 // default value if null
}

即使返回值始终为非空,以下内容也不会编译,这对我来说很有意义,因为类型不是推断出来的,而是从支持字段中获取的:
val a: Int = Test().num

Type mismatch: inferred type is Int? but Int was expected



问题是如何将该 getter 的返回类型更改为不可为空?如果我这样做,编译器会说:

Getter return type must be equal to the type of the property, i.e. 'Int?'



我知道我可以用另一个属性来解决它 numNotNullable (没有支持字段)。
class Test {
    var num: Int? = null
        get() = field ?: 5 // default value if null

    val numNotNullable: Int
        get() = num ?: 5
}

val c: Int = Test().numNotNullable

但这不是我想要的。 还有其他方法吗?

最佳答案

var num: Int? = null
这是您的属性(property)签名。没关系,如果你在内部确保没有 null值被返回。签名说,该值可以为空。

这意味着:

  • 您可以设置 null到此字段
  • 所有使用此字段的类,必须处理该属性可以返回 null 的事实。

  • 您具有第二个属性的解决方案很好。

    您当然可以用普通的旧 java bean 替换该属性,但我不建议这样做,因为您必须使用 getNumb 访问该属性。和 setNum .
    class Test {
        private var num: Int = 5
    
        fun setNum(num: Int?) {
            this.num = num ?: 5
        }
    
        fun getNum() = num
    }
    

    关于kotlin - 即使支持字段可以为空,getter 也会返回不可为空的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46606504/

    相关文章:

    java - 从 fragment 的参数获取数据

    collections - 如何在特定索引中添加新项目?

    只有 getter 的 JavaScript ES6 类

    c++ - 如果 C++ 中不存在 getter 和 setter,有没有办法自动生成它们?

    java - 在 Java 类中实现 Getter 和 Setter 方法是否总是合适的

    reflection - kotlin反射获取字段列表

    java - Android Studio 3.0 金丝雀 1 : Kotlin tests or Java tests referring to Kotlin classes fail

    c# - Nullable初始化为null——理解源码

    sql - 在grails中,我已经投入生产后,需要将域类中的字段更改为可为空

    c# - 比较可空值和空值