オブジェクトの型がAny
であることがわかっていたときに、関数の引数のコンパイルタイプを関数のシグネチャに定義されている期待された型に強制的に設定する方法はありますか?私はそれを簡単な例で説明しましょう。コンパイル時の関数の引数がScalaの特定の型になるようにするには?
def writeInt(value: Int): Unit { ... }
def writeString(value: String): Unit { ... }
def get(name: String): Any = { ... }
は、私は次のコードを作ることができる方法を明示的get
リターンが使用されるべきことを述べるために彼のプログラムでwriteInt
機能を参照するプログラマを強制することなく正常にコンパイル:
たちは、次の3つの機能を定義していることを考えると.asInstanceOf[Int]
:get
ので
writeInt(get("dividend").asInstanceOf[Int]) // this works...
writeInt(get("dividend")) // but this does not :(
Int
ならびにであってもよい、Any
オブジェクトを返すことができますは、スカイラで醜い.asInstanceOf[Int]
表記でそれを解決するためのエレガントな方法はありますか?私はget("dividend")
ことを知って、
writeString(get("name").asInstanceOf[String]) // this works...
writeString(get("name")) // but this does not :(
基本的に:
プログラムの他の部分では、私はそれぞれ再び.asInstanceOf[String]
を入力することなく、同じ機能を使用してこのコードを書くことができるようにしたいと思いますのでご注意くださいInt
を返し、get("name")
はString
を返します。しかし、どのように私はあまりにも混乱せずにコンパイラにそれを知らせることができますか?
私は短い答えは「いいえ」だと思います。戻り値の型がAnyの場合、コンパイラが知る方法はありません。 – marios
一つのアイデアは、あなたのゲッターに 'def get [Name]:String ... def get [Id]:Long'という文字列ではなく、その型で動作させることです。名前とIDはここで作成したカスタムタイプです。 – marios
面白いアイデアをありがとうございますが、私のユースケースではうまくいかないでしょう。文字列は、外部から来る任意の文字列になるため、型に置き換えることはできません。文字通り何でもかまいません。 –