如何获取某个特征的 val 实例的 class?

How to get the class of a certain trait's val instance?

抱歉,如果我的问题很愚蠢,但我是 Scala 初学者。我有类似以下内容:

trait Pet {
  val name: String
}

class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet

def eval(animal: Pet): returnType = {
  ...
}

我正在尝试以不同的方式操纵动物,无论是猫还是狗。 到目前为止,这是我尝试过的方法:

def eval(animal: Pet): returnType = {
  if (animal.type == Cat) {
    print("This is cat")
  }
  else {
    print("This is dog")
  }
}

但是,这是行不通的。有什么建议吗?

作为一般规则,不要在 trait 中使用 val,除非您确切知道 class 树的初始化工作原理。

实际问题可以用case classmatch来解决:

trait Pet {
  def name: String
}

case class Cat(name: String) extends Pet
case class Dog(name: String) extends Pet

def eval(animal: Pet) =
  animal match {
    case Cat(name) =>
      print("This is cat")
    case Dog(name) =>
      print("This is dog")
  }