我正在学习 kotlin 中的类扩展,并且遇到了这个错误。您能向我解释一下为什么会这样吗:
open class Animal
class Zebra: Animal()
fun main() {
    var animal = Zebra()
    animal = Animal()  // Error: Type mismatch
}
Run Code Online (Sandbox Code Playgroud)
    Kotlin\xe2\x80\x99s 类型推断是 JVM 世界中最流行的 Kotlin 功能之一。如此受欢迎,以至于 Java 10 也引入了类型推断(与 Kotlin 相比有限)。不过,使用此功能存在一些危险。最重要的是,我们需要记住,赋值的\n推断类型是右侧的确切类型,\n而不是超类或接口:
\n在大多数情况下,这不是问题。当我们推断的类型限制过多时,我们只需指定它即可解决我们的问题:
\nopen class Animal\nclass Zebra: Animal()\nfun main() {\n    var animal: Animal = Zebra()\n    animal = Animal()\n}\nRun Code Online (Sandbox Code Playgroud)\n但是,当我们不控制库或另一个模块时,就没有这样的安慰了。在这种情况下,推断类型说明\n可能非常危险。让\xe2\x80\x99s 看一个例子。\n让\xe2\x80\x99s 说你有以下接口用于表示\n汽车工厂
\ninterface CarFactory {\n  fun produce(): Car\n}\nRun Code Online (Sandbox Code Playgroud)\n如果没有指定其他内容,还会使用默认汽车:
\nval DEFAULT_CAR: Car = Fiat126P()\nRun Code Online (Sandbox Code Playgroud)\n现在,你们所有的工厂只能生产Fiat126P。不好。如果您自己定义了这个接口,那么这个问题可能很快就会被捕获并且很容易修复。不过,如果它是外部 API 的一部分(元素(类、函数、对象),可能会从某些外部模块或由不同开发人员维护的代码的某些部分使用。例如,在库中,这些是所有公共和受保护的类、函数和对象声明),您可能会首先被愤怒的用户通知。\n除此之外,当有人不太了解 API 时,返回类型是重要的信息,因此,为了为了提高可读性,我们应该使其明确,尤其是从外部可见的 API 部分(因此公开的 API)。
\nKotlin(实际上是 IDE)向 Zebra 推断动物类型:
var animal = Zebra()   // animal is of type Zebra
animal = Animal()      // type mismatch since Animal is not a Zebra
Run Code Online (Sandbox Code Playgroud)
如果您明确指定类型为 Animal,那么您可以在下一行分配一个 Animal:
var animal: Animal = Zebra()   // animal is of type Animal
animal = Animal()              // this works
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           279 次  |  
        
|   最近记录:  |