如何在Scala中转换变量?

Eug*_*ota 197 scala

给定一个带类型的变量Graphics,如何将其转换Graphics2D为Scala?

Dan*_*wak 281

首选技术是使用模式匹配.这使您可以优雅地处理有问题的值不是给定类型的情况:

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}
Run Code Online (Sandbox Code Playgroud)

该块复制了该asInstanceOf[Graphics2D]方法的语义,但具有更大的灵活性.例如,您可以为各种类型提供不同的分支,同时有效地执行多个条件转换.最后,你真的不需要在catch-all区域抛出一个异常,你也可以返回null(或者最好None),或者你可以进入一些没有的回退分支Graphics2D.

简而言之,这真的是要走的路.它在语法上比笨重一点asInstanceOf,但增加的灵活性几乎总是值得的.

  • +1因为它很有趣,但对于这种情况来说有点太多了.不是吗? (19认同)
  • 试试这个:`base match {case base @ MyConcrete(value)=> base.something(value)}`显然,遮蔽`base`是可选的.您可以轻松使用不同的变量名称. (4认同)

Eug*_*ota 223

g.asInstanceOf[Graphics2D];
Run Code Online (Sandbox Code Playgroud)

  • 一旦我习惯了Scala,我学会了不使用`asInstanceOf`,因为它违背了静态类型系统的目的并且感觉很难吃. (36认同)
  • 不幸的是,这是使用Swing时的常见操作.对于自定义绘制操作,您需要覆盖'public void paintComponent(Graphics g)'方法.Graphics参数实际上是Graphics2D实例,但需要强制转换.模式匹配版本可能比保证更详细.记住:狡猾地避开混淆的夸张和冗长! (26认同)
  • @LemuelAdane你使用强化转换的事实是代码气味,让它们变得更容易是没有意义的. (16认同)
  • @hohonuuli我认为在特定情况下演员阵容很好,但如果使用`scala-swing`组件,paintComponent的参数已经是Graphics2D所以不需要演员表 (7认同)
  • 为什么这么久?为什么"asInstanceOf何时只能"作为"或"asof"关键字或方法?或者为什么他们不仅仅采用C++和Java方式作为选项,因为这是传统的并且没有大问题? (2认同)