2009-05-31 34 views

回答

276

首选技术是使用模式匹配。这可以让你优雅的处理这些问题的价值不是给定类型的情况:

g match { 
    case g2: Graphics2D => g2 
    case _ => throw new ClassCastException 
} 

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

总之,这是真的要走的路。它的语法体积比asInstanceOf稍大,但增加的灵活性几乎总是值得的。

215
g.asInstanceOf[Graphics2D]; 
+34

一旦我习惯了Scala,我学会了不使用`asInstanceOf`,因为它违背了静态类型系统的目的,并且感觉很糟糕。 – 2011-02-26 22:51:43

+24

不幸的是,这是使用Swing时的常见操作。对于自定义绘画操作,您需要重写'public void paintComponent(Graphics g)'方法。 Graphics参数实际上是一个Graphics2D实例,但需要强制转换。模式匹配版本可能比保证更冗长。请记住:绝对避免混淆的混乱和冗长! – hohonuuli 2011-10-16 06:19:28