【发布时间】:2010-10-30 05:01:09
【问题描述】:
给定一个类型为Graphics的变量,
如何在 Scala 中将其转换为 Graphics2D?
【问题讨论】:
标签: scala
给定一个类型为Graphics的变量,
如何在 Scala 中将其转换为 Graphics2D?
【问题讨论】:
标签: scala
首选技术是使用模式匹配。这使您可以优雅地处理所讨论的值不是给定类型的情况:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
此块复制了asInstanceOf[Graphics2D] 方法的语义,但具有更大的灵活性。例如,您可以为各种类型提供不同的分支,同时有效地执行多个条件转换。最后,你真的不需要在 catch-all 区域抛出异常,你也可以返回 null(或者最好是 None),或者你可以输入一些后备分支在没有Graphics2D 的情况下工作。
简而言之,这确实是要走的路。它在语法上比 asInstanceOf 大一点,但增加的灵活性几乎总是值得的。
【讨论】:
base match { case MyConcrete(value) => base.asInstanceOf[MyConcrete].something(value) } , 有没有办法通过“case MyConcrete(value)”执行的“unapply”调用来提取“value”,即使想提取“value”也可以将“base”转换为 MyConcrete?
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 所以不需要演员表