Scala转换并避免asInstanceOf

时间:2014-12-23 05:54:34

标签: 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

但这似乎不起作用。

1 个答案:

答案 0 :(得分:6)

您可以在案例部分中指定您期望dog对象:

case x: dog => x.bark

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

case _ => "unknown pet"