2017-07-04 7 views
1

私はScalaを初めて使う人です。私は、タイプRQのリクエストをサーバに送り、レスポンス[RSP]のレスポンスを受け取るメソッドを書いています。簡易版:私が電話をかけるための方法を定義する:2つのジェネリックを持つスカラー法で、1つを推論することができます

def invoke[RQ, RSP](request: RQ): Response[RSP] = {....} 

Iメソッドを呼び出すと、私は受信変数の型を指定した場合、すべてのパラメータが次のように推測することができる。

val result: Response[Double] = invoke("Hello") 

しかし、私がちょうどinvoke("Hello")と何も割り当てないと言うと、それはコンパイルされません。 2つのジェネリックタイプ(たとえばinvoke[String, Double]("Hello"))を指定する必要があります。私の質問です:文字列は、パラメータから推論することができます。 RSPジェネリックだけを指定してコールを書き込む方法はありますか?の行の何か:invoke[ , Double]("Hello")

+0

要求の種類と予想される応答の間には関係がありますか? –

+0

いいえ、これはRESTfulな呼び出しです。したがって、他のパラメータ(メソッド、URLなど)によっては、戻り値の型は何でもかまいません。 Jörgは良い説明と、これを追加する言語の可能性を提供しました。 – DDRider62

答えて

2

No.

これは何回か尋ねられた機能です。 Scalaのの将来のバージョンでは、方法のために名前付き引数に似た構文をサポートすることがあります。現時点では

invoke[RSP = Double]("Hello") 

、そこに方法は一つだけの型パラメータを持つように何もずっとあなたが再構築を除いて、あなたのコードを実行することはできませんし、 2番目は周囲のコンテキストから来ます。

さらに興味深いのは、どうしても結果を放棄すれば、戻り値の型が気になるのでしょうか?あなたのメソッドがCommand-Query Separation Principleに違反しているようです。メソッドが単にUnitを返した場合は、2番目の型パラメータは不要で、すべて正常に動作します。戻り値を実際に使用した場合、型推論器は少なくともコンテキストから2番目の型パラメータを推論する機会があります。しかし、戻り値の型パラメータを持ち、戻り値を無視しているということは、型推論器が見るためのコンテキストがないことを意味します。

+0

私は結果を捨てることはありませんが、私は最初から孤立させようと努力していました。値がメソッドの戻り型になると、その型が推論されます。あなたの反応は私にこれを見るのを助けました。ありがとう。私は「私はScalaにとって新しい(非常に新しい) – DDRider62

関連する問題