为什么要进行类型检查以防引发警告

时间:2018-07-21 14:03:52

标签: scala

我正在尝试检查地图中的所有值是否均为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

2 个答案:

答案 0 :(得分:2)

您的地图不包含植物。它包含在调用时返回Plants的函数。您应该通过在地图中编写Dog()等来应用它们,或者更好的是,将植物定义为案例对象而不是类(因此不需要应用它们)。

答案 1 :(得分:1)

object自动生成的同伴case class不会扩展其同伴class,也不是其实例。

换句话说,Hibiscus伴随对象不会扩展case class Hibiscus(),也不是case class Hibiscus()的实例,因此它也不是实例的Fruit

由于Hibiscus是一个常量,因此编译器知道运行时它将是哪种类型,并警告您它永远无法与您要测试的类型匹配,因此该模式的分支不可访问。 / p>