Scala 类型转换和避免 asInstanceOf

标签 scala

在下面的代码中,是否可以在不使用 asInstanceOf 的情况下重新表述?我发现了一些应该避免使用 asInstanceOf/isInstanceOf 的样式指南建议,并且我设法清理了我的代码,除了如下所示的用法。

我确实找到了一个重复的问题 here ,但对于这个特定案例,它并没有真正帮助我,或者我只是一个初学者,无法将其转化为我自己的用例。

trait pet {}
class dog extends pet {
  def bark: String = {
    "WOOF"
  }
}

def test(what: pet) : String =
{
  what match {
    case _:dog =>
      val x = what.asInstanceOf[dog]
      x.bark
  }
}

test(new dog())

我试过例如:

val x = what : dog

但这似乎不起作用。

最佳答案

您可以只在 case 部分指定您期望的 dog 对象:

case x: dog => x.bark

但是现在如果将非狗对象传递给您的方法,您可能会收到 scala.MatchError。因此,您需要添加具有如下理想行为的默认情况:

case _ => "unknown pet"

关于Scala 类型转换和避免 asInstanceOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27614854/

相关文章:

scala - 如何迭代 DataStream

scala - 我应该把我的资源放在 Scala 的什么地方?

scala - 自动更新 sbt 依赖到最新版本

json - Jackson Scala 模块,嵌套列表和 map

scala - Akka http 连接池

scala - Akka 和 Play on Heroku : Should I have my actors on seperate dyno or in the web dyno?

scala - 关于如何将 Scala 映射到 jvm 字节码的良好引用

mysql - 如何使用play框架从scala中的Mysql中获取结果之和?

scala - 如果抛出异常,Akka Actor 不会终止

scala - 通过类型的大小写匹配,根据 SparkSQL 中的类型转换值