【问题标题】:How do I cast a variable in Scala?如何在 Scala 中转换变量?
【发布时间】:2010-10-30 05:01:09
【问题描述】:

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    首选技术是使用模式匹配。这使您可以优雅地处理所讨论的值不是给定类型的情况:

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

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

    简而言之,这确实是要走的路。它在语法上比 asInstanceOf 大一点,但增加的灵活性几乎总是值得的。

    【讨论】:

    • +1 因为它很有趣,但对于这种情况来说有点太多了。不是吗?
    • 如果我已经进行了模式匹配但失去了对转换值的引用: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 是可选的。您可以轻松地使用不同的变量名。
    • 我不明白的是,您如何将此模式匹配的结果转换为变量?如果它是 String a = (String) b; 就像在 java 中一样scala 等价物是什么?
    • @JamesMcMahon val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
    【解决方案2】:
    g.asInstanceOf[Graphics2D];
    

    【讨论】:

    • 当我习惯了 Scala 后,我学会了不使用 asInstanceOf,因为它违背了拥有静态类型系统的目的并且感觉很糟糕。
    • 不幸的是,这是使用 Swing 时的常见操作。对于自定义绘画操作,您需要重写 'public void paintComponent(Graphics g)' 方法。 Graphics 参数实际上是一个 Graphics2D 实例,但需要强制转换。模式匹配版本可能比保证的更冗长。记住:刻意避免令人费解的冗长和冗长!
    • @hohonuuli 我认为这种特定情况下的演员阵容很好,但如果你使用scala-swing 组件,paintComponent 的参数已经是 Graphics2D 所以不需要演员表
    • 为什么这么长?为什么 "asInstanceOf when 只能是 "as" 或 "asof" 关键字或方法?或者为什么他们不只是采用 C++ 和 Java 方式作为选项,因为那是常规的并且没有什么大问题?跨度>
    • @LemuelAdane 您使用强制转换的事实是一种代码味道,让它们变得更容易是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2018-07-16
    • 2014-12-05
    • 1970-01-01
    • 2017-05-20
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多