1
object GoodReturnType extends Dynamic {
  def applyDynamic(method: String)(args: Any*) = {
    method match {
      case "foo" => 25
      case "bar" => 14
    }
  }
}

GoodReturnTypeオブジェクトのメソッドapplyDynamicには、 Intリターン型があります。予想どおり、動的メソッドを呼び出すとIntも返されます。

scala> GoodReturnType.foo() 
res0: Int = 25

戻り値のタイプが異なる別の動的メソッドを追加しようとすると、 applyDynamicの戻り値タイプが最も一般的なタイプ(Any)になります。したがって、すべての動的メソッドと同様です。

object BadReturnType extends Dynamic {
  def applyDynamic(method: String)(args: Any*) = {
    method match {
      case "foo" => 25
      case "bar" => 14
      case "baz" => "muahahaha!"
    }
  }
}

scala> BadReturnType.foo() 
res1: Any = 25

異なる戻り型を持つ複数の動的メソッドを持つクラスを持つことは可能ですか?

4

2 に答える 2

4

動的な情報に基づいてディスパッチしているため、これは原則として不可能です。したがって、特定の方法で入力された応答があったとしても、呼び出し元のコードは、使用可能なセットからどのタイプが返されたかを認識しません。Either必要に応じてこれを明示的に表現するために使用できますが(たとえばLeft(5)Right("muahaha")を返すEither[Int,String])、基本的に、動的ディスパッチ手順を実行した後、静的型付けを保持することはできません。これを動的ディスパッチステップとして使用しない場合は、メソッドを直接挿入してみませんか?

于 2013-01-23T16:24:20.810 に答える
2

いいえ、あなたがすることはできません。Dynamic静的にチェックされていないすべての参照がマップされる、固定された事前定義された一連のメソッドがあります。JVM は、戻り値の型だけに基づくメソッド解決をサポートしていないため、特定の引数シグネチャに対して単一の実装を選択する必要があります

まだお持ちでない場合は、SIP 17: Type Dynamicを学習してください。

于 2013-01-23T16:55:03.473 に答える