2

私は Scala プログラミングにかなり慣れていないので、何かを行うための正規の方法をまだ考え出しています。foo最近、唯一のパラメーターとして一連の型のみを受け入れる関数を書きたいと思いました。のようなものを考えてください

def foo(x: [Int, String]) = ???

しかし、上記の構文に近いものは見つかりませんでした (これが最も自然だと思います)。型を使用Anyすると、コンパイル側のチェックが緩み、問題がランタイム領域に逃げやすくなります。

私が思いついた最高のものは次のようなものです:

sealed abstract class Base
case class TypeInt(v: Int) extends Base
case class TypeString(v: String) extends Base

implicit def toTypeInt(v: Int) = TypeInt(v)
implicit def toTypeString(v: String) = TypeString(v)

def foo(x: Base) = x match {
  case TypeInt(v) => println("Int: ", v)
  case TypeString(v) => println("String: ", v)
}

foo(1)
foo("hello")

implicit case class ...(補足として、関数を手動で作成することを避けるために書くことができるようにしたいのtoType*ですが、それはコンパイルされません。)

タイプセーフな方法で一連のタイプのパラメーターを受け入れる関数を作成する簡単な方法はありますか?

UPDATE :実際には、私の特定のケースでは、メソッドのオーバーロードを使用できたことがわかりました。何らかの理由で、Scala ワークシートでメソッドのオーバーロードをまったく使用できないため、Scala にはオーバーロードがまったくないのではないかと思いました。しかし、私は間違っていました。通常の Scala ソースでは、それを使用できるはずです。以下のコメントで言及されているマグネット パターンに関する記事で説明されている、オーバーロードの使用にはまだいくつかの欠点があります (たとえば、JVM ジェネリックの型消去のために、型 Foo[Type1] および Foo[Type2] をオーバーロードする方法はありません。

4

1 に答える 1