gpt4 book ai didi

java - Kotlin 类型方差和星形投影

转载 作者:行者123 更新时间:2023-12-02 12:48:24 24 4
gpt4 key购买 nike

我已经阅读了有关类型投影和星形投影的书(Kotlin in Action, MEAP)、文档和文章,但投影似乎仍然写得很复杂。有人可以简单地解释投影背后的想法吗?有一些适当的例子会很好。
提前致谢

最佳答案

泛型可能是所有拥有它们的编程语言中最有趣的话题。如果您了解 Java,您将轻松掌握 Kotlin 泛型:

  • 类型投影<out T>反射(reflect)到 <? extends T>在 java 。
  • 类型投影<in T>反射(reflect)到 <? super T>在 java 。
  • 星空投影<*>反射(reflect)到 <?>在 java 。

  • 如果您不了解 Java,请再次阅读“Kotlin in Action”一书的第 9 章。类型差异在那里得到了很好的解释。但是,关于星投影的部分中 list 9.19(第 251 页)的评论似乎存在问题。
    >>> val stringValidator = validators[String::class] as FieldValidator<String>
    >>> println(stringValidator.validate(""))
    false

    他们说:

    The compiler emits a warning about the unchecked cast.



    确实如此。编译器发出警告,但同一段的下一句似乎不正确:

    Note, however, that this code will fail on validation only, not when you make the cast, because at runtime all the generic type information is erased.



    如果这意味着前面的代码片段应该返回 true 而不是 false,那么他们就错了。输出是准确的,但解释似乎具有误导性,或者我错过了理解某些东西。

    p.s.
    以下是理解先前代码片段所需的一些额外代码:
    interface FieldValidator<in T> {
    fun validate(input: T): Boolean
    }

    object DefaultStringValidator : FieldValidator<String> {
    override fun validate(input: String) = input.isNotEmpty()
    }

    val validators = mutableMapOf<KClass<*>, FieldValidator<*>>()

    validators[String::class] = DefaultStringValidator

    不确定,但也许所有这些都是书中使用的 Kotlin v1.0 中的一个问题。我已经用 v1.2.50 对其进行了测试。

    关于java - Kotlin 类型方差和星形投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47968487/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com