【问题标题】:Kotlin codelab: no return value, so why is generic type returned?Kotlin codelab:没有返回值,那为什么返回泛型类型?
【发布时间】:2020-03-26 13:58:48
【问题描述】:

我最近在 Google 代码实验室中为 Kotlin 浏览 lesson,我无法理解这部分:

这是水族馆的定义:

class Aquarium<T: WaterSupply>(val waterSupply: T) {
    fun addWater() {
        check(!waterSupply.needsProcessing) { "water supply needs processing first" }
        println("adding water from $waterSupply")
    }    
}

查看 Aquarium 类,您会发现只有在获取属性 waterSupply 时才会返回泛型类型。没有任何方法将 T 类型的值作为参数(除了在构造函数中定义它)。 Kotlin 允许您为这种情况定义类型,并且它可以推断出有关类型在何处可以安全使用的额外信息。类似地,您可以在类型中定义仅传递给方法而不是返回的泛型类型。这允许 Kotlin 对代码安全进行额外检查。

Aquarium 类中只有一个函数,它什么都不返回(Unit),而不是 WaterSupply(这个例子可能是指“通用类型”的 WaterSupply)。我很困惑为什么代码实验室说返回泛型类型(WaterSupply),而什么都不应该返回?

【问题讨论】:

  • 'val waterSupply' 是一个属性,因此可以通过调用 'aquarium.waterSupply' 来访问(返回)

标签: android kotlin


【解决方案1】:

这里的关键是这部分:

只有在获取属性 waterSupply 时才会返回泛型类型

Aquarium 类的构造函数采用 val waterSupply: T。注意val 部分;这会导致 Kotlin 编译器将 waterSupply 公开为任何 Aquarium 实例的属性。因此,您可以调用 someAquariumInstance.waterSupply 并返回 T 类型的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2017-06-20
    相关资源
    最近更新 更多