代码之家  ›  专栏  ›  技术社区  ›  Alexey Romanov

零冰在scala中“检查铸造”

  •  2
  • Alexey Romanov  · 技术社区  · 15 年前

    爪哇零冰 translates 每个切片接口 Simple 代理接口 SimplePrx 代理 SimplePrxHelper . 如果我有 ObjectPrx (所有代理的基本接口),我可以检查它是否有接口 简单的 通过使用静态方法 简单助手 :

    val obj : Ice.ObjectPrx = ...;        // Get a proxy from somewhere...
    
    val simple : SimplePrx = SimplePrxHelper.checkedCast(obj);
    if (simple != null)
        // Object supports the Simple interface...
    else
        // Object is not of type Simple...
    

    我想写一个方法 castTo 这样我就可以把第二行替换为

    val simple = castTo[SimplePrx](obj)
    

    val simple = castTo[SimplePrxHelper](obj)
    

    据我所见,scala的类型系统不够表达,无法让我定义 卡斯托 . 这是正确的吗?

    2 回复  |  直到 15 年前
        1
  •  4
  •   RM.    15 年前

    应该能够处理隐式,沿着这些线:

    object Casting {
      trait Caster[A] {
        def checkedCast(obj: ObjectPrx): Option[A]
      }
    
      def castTo[A](obj: ObjectPrx)(implicit caster: Caster[A]) =
        caster.checkedCast(obj)
    
      implicit object SimplePrxCaster extends Caster[SimplePrx] {
        def checkedCast(obj: ObjectPrx) = Option(SimplePrxHelper.checkedCast(obj))
      }
    }
    

    然后你只需要把你想用的东西放在范围内:

    package my.package
    
    import Casting._
    
    ...
      def whatever(prx: ObjectPrx) {
        castTo[SimplePrx](prx) foreach (_.somethingSimple())
      }
    ...
    
        2
  •  1
  •   Rex Kerr    15 年前

    您可以使用结构类型获得类似于所需的内容:

    def castTo[A](helper: { def checkedCast(o: Object): A })(o: Object) = {
      helper.checkedCast(o)
    }
    class FooPrx { }
    object FooPrxHelper {
      def checkedCast(o: Object): FooPrx = o match {
        case fp : FooPrx => fp
        case _ => null
      }
    }
    
    scala> val o: Object = new FooPrx
    o: java.lang.Object = FooPrx@da8742
    
    scala> val fp = castTo(FooPrxHelper)(o)
    fp: FooPrx = FooPrx@da8742
    
    推荐文章