【发布时间】:2018-06-21 03:48:37
【问题描述】:
我已经阅读了关于类型投影和星形投影的书(Kotlin in Action, MEAP)、文档和文章,但投影似乎仍然写得很复杂。有人可以简单地解释投影背后的想法吗?有一些适当的例子会很好。 提前致谢
【问题讨论】:
我已经阅读了关于类型投影和星形投影的书(Kotlin in Action, MEAP)、文档和文章,但投影似乎仍然写得很复杂。有人可以简单地解释投影背后的想法吗?有一些适当的例子会很好。 提前致谢
【问题讨论】:
泛型可能是所有拥有它们的编程语言中最有趣的话题。如果您了解 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 测试过了。
【讨论】: