ZeroC Ice在Scala中“检查了演员阵容”

时间:2010-04-22 16:48:53

标签: scala types ice

ZeroC Ice for Java translates每个Slice接口Simple进入(除其他外)代理接口SimplePrx和代理SimplePrxHelper。如果我有一个ObjectPrx(所有代理的基本接口),我可以通过Simple上的静态方法检查它是否实际上有接口SimplePrxHelper

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的类型系统没有足够的表现力来允许我定义castTo。这是对的吗?

2 个答案:

答案 0 :(得分:4)

应该可以用这些方式做一些暗示:

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())
  }
...

答案 1 :(得分:1)

你可以通过结构类型得到你想要的东西:

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