我正在尝试检查地图中的所有值是否均为Plant类型。我知道有更好的方法可以做到这一点。但是我试图理解比赛,我想知道为什么这行不通。我在这里犯了什么错误?
为什么会有警告。 ab2具有所有植物,但是为什么它不返回true?
abstract class Living
abstract class Animal extends Living
abstract class Plant extends Living
case class Dog() extends Animal
case class Hibiscus() extends Plant
case class Apple() extends Plant
val ab1 = Map(1 -> Dog, 2 -> Hibiscus)
val ab2 = Map(1 -> Apple, 2 -> Hibiscus)
val isPlant = ab2.forall((x) => x match {
case (x: Int, p: Plant) => true
case _ => false
})
print(isPlant)
输出
Solution.scala:18: warning: fruitless type test: a value of type scala.runtime.AbstractFunction0[Solution.Plant with Product with Serializable] cannot also be a Solution.Plant
case (x: Int, p: Plant) => true
^
one warning found
false
编辑:如果我明确定义了类型,我可能已经抓住了这个问题
abstract class Living
abstract class Animal extends Living
abstract class Plant extends Living
case class Dog() extends Animal
case class Hibiscus() extends Plant
case class Apple() extends Plant
val ab1: Map[Int,Living] = Map(1 -> Dog, 2 -> Hibiscus)
val ab2: Map[Int,Living] = Map(1 -> Apple, 2 -> Hibiscus)
val isPlant = ab2.forall((x) => x match {
case (x: Int, p: Plant) => true
case _ => false
})
print(isPlant)
错误:
Solution.scala:13: error: type mismatch;
found : Solution.Dog.type
required: Solution.Living
val ab1: Map[Int,Living] = Map(1 -> Dog, 2 -> Hibiscus)
^
Solution.scala:13: error: type mismatch;
found : Solution.Hibiscus.type
required: Solution.Living
val ab1: Map[Int,Living] = Map(1 -> Dog, 2 -> Hibiscus)
^
Solution.scala:14: error: type mismatch;
found : Solution.Apple.type
required: Solution.Living
val ab2: Map[Int,Living] = Map(1 -> Apple, 2 -> Hibiscus)
^
Solution.scala:14: error: type mismatch;
found : Solution.Hibiscus.type
required: Solution.Living
val ab2: Map[Int,Living] = Map(1 -> Apple, 2 -> Hibiscus)
^
four errors found
答案 0 :(得分:2)
您的地图不包含植物。它包含在调用时返回Plants的函数。您应该通过在地图中编写Dog()
等来应用它们,或者更好的是,将植物定义为案例对象而不是类(因此不需要应用它们)。
答案 1 :(得分:1)
为object
自动生成的同伴case class
不会扩展其同伴class
,也不是其实例。
换句话说,Hibiscus
伴随对象不会扩展case class Hibiscus()
,也不是case class Hibiscus()
的实例,因此它也不是实例的Fruit
。
由于Hibiscus
是一个常量,因此编译器知道运行时它将是哪种类型,并警告您它永远无法与您要测试的类型匹配,因此该模式的分支不可访问。 / p>