【问题标题】:Kotlin type variance and star projectionKotlin 类型方差和星形投影
【发布时间】:2018-06-21 03:48:37
【问题描述】:

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

【问题讨论】:

    标签: java generics kotlin


    【解决方案1】:

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

    • 类型投影<out T> 反映到Java 中的<? extends T>
    • 类型投影<in T> 反映到Java 中的<? super T>
    • 星形投影<*> 在Java 中反映到<?>

    如果您不了解 Java,请再次阅读“Kotlin in Action”一书的第 9 章。类型差异在那里得到了很好的解释。但是,关于 star projection 部分的清单 9.19(第 251 页)的评论似乎存在问题。

    >>> val stringValidator = validators[String::class] as FieldValidator<String>
    >>> println(stringValidator.validate(""))
    false
    

    他们说:

    编译器发出有关未经检查的强制转换的警告。

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

    但是请注意,此代码只会在验证时失败,而不是在您进行强制转换时失败,因为在运行时所有泛型类型信息都会被删除。

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

    附言 这是理解之前的代码 sn-p 所需的一些额外代码:

    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 测试过了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多