Answers:
首选技术是使用模式匹配。这使您可以优雅地处理所涉及的值不是给定类型的情况:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
该块复制了该asInstanceOf[Graphics2D]
方法的语义,但具有更大的灵活性。例如,您可以为各种类型提供不同的分支,从而有效地同时执行多个条件转换。最后,您实际上并不需要在“包罗万象”区域中引发异常,也可以返回null
(或最好是None
),也可以输入一些不使用的后备分支Graphics2D
。
简而言之,这确实是要走的路。它在语法上比稍大asInstanceOf
,但增加的灵活性几乎总是值得的。
base match { case base @ MyConcrete(value) => base.something(value) }
显然,阴影base
是可选的。您可以轻松地使用其他变量名。
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
,因为它违反了具有静态类型系统的目的,并且令人讨厌。
scala-swing
组件,paintComponent的参数已经是Graphics2D,因此不需要