gpt4 book ai didi

scala - 为什么该类型导致 "Product with Serializable with Animal"而不仅仅是 Animal?

转载 作者:行者123 更新时间:2023-12-04 17:52:38 24 4
gpt4 key购买 nike

假设我有

val flag = true

为什么类型会导致 Product with Serializable with Animal而不仅仅是 Animal ?
class Animal(name : String)
case class Herbivore(name : String) extends Animal(name)
case class Carnivore(name : String) extends Animal(name)

val cow = new Herbivore("cow")
val tiger = new Carnivore("tiger")

if (flag) cow else tiger // Why is type Product with Serializable with Animal?

最佳答案

案例类 automatically extend Product with Serializable所以

class Animal(name : String)
case class Herbivore(name : String) extends Animal(name)
case class Carnivore(name : String) extends Animal(name)

实际上是
class Animal(name : String)
case class Herbivore(name : String) extends Animal(name) with Product with Serializable
case class Carnivore(name : String) extends Animal(name) with Product with Serializable

因此最精确的类型 if (flag) cow else tiger表达式编译器可以推断为 Product with Serializable with Animal .如果我们从案例类更改为这样的类
class Animal(name : String)
class Herbivore(name : String) extends Animal(name)
class Carnivore(name : String) extends Animal(name)

那么 if-else 表达式的推断类型确实是 Animal .

根据@TravisBrown 的建议,使 ADT 根扩展 Product with Serializable像这样
abstract class Animal(name : String) extends Product with Serializable
case class Herbivore(name : String) extends Animal(name)
case class Carnivore(name : String) extends Animal(name)

将使 if-else 表达式的推断类型也 Animal .

关于scala - 为什么该类型导致 "Product with Serializable with Animal"而不仅仅是 Animal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56488467/

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