2

ZeroC Ice for Javaは、すべてのSliceインターフェースを(とりわけ)プロキシインターフェースとプロキシに変換します。(すべてのプロキシのベースインターフェイス)がある場合は、静的メソッドを使用して、実際にインターフェイスがあるかどうかを確認できます。SimpleSimplePrxSimplePrxHelperObjectPrxSimpleSimplePrxHelper

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...

castTo2行目を次のように置き換えることができるようにメソッドを作成したかった

val simple = castTo[SimplePrx](obj)

また

val simple = castTo[SimplePrxHelper](obj)

私が見る限り、Scalaの型システムは私が定義できるほど表現力がありませんcastTo。これは正しいです?

4

2 に答える 2

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())
  }
...
于 2010-04-22T19:42:36.500 に答える
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
于 2010-04-22T19:02:41.127 に答える