Kotlin型方差和星投影

时间:2017-12-25 12:11:24

标签: java generics kotlin

我已经读过这本书(Kotlin in Action,MEAP),关于类型投影和星形投影的文档和文章,但是投影似乎写得非常复杂。有人可以用简单的方式解释投影背后的想法吗?有一些合适的例子会很高兴。 提前致谢

1 个答案:

答案 0 :(得分:1)

泛型可能是在拥有泛型的每种编程语言中最有趣的话题。如果您了解Java,则可以轻松选择Kotlin泛型:

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

如果您不懂Java,请再次阅读“ Kotlin in Action”一书中的第9章。在那里很好地解释了类型差异。但是,关于恒星投射的部分中列出9.19(第251页)的评论似乎存在问题。

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

他们说:

  

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

是的。编译器发出警告,但同一段落的下一个句子似乎不正确:

  

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

如果这意味着先前的代码段应该返回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进行了测试。