3

こんにちは、StackOverflowです。

ここで私の最初の質問を手伝ってくれることを願っています:)

だから私はScala型推論に問題があります。コードは次のとおりです。

object Problem {

  def ok(fn: (String) => Unit) = fn("")

  // type mismatch; found: java.lang.String("") required: String
  def fail[String](fn: (String) => Unit) = fn("")

}

Scalaはここでどのような文字列を期待していますか?

これは私の問題を説明するための最小限の例であることに注意してください。元の問題は、より複雑なインターフェイス(正確には、PlayのIteratee)を実装しようとしたときに発生したため、いいえ、除外すること[String]はできません。(誰かが実際のコードが役立つと思うなら、私はそれを提供します。)

試してみdef fail[java.lang.String] ...ましたが、と書いてありexpected ], found .ます。

Scala String vs java.lang.String-vs.についての良い説明を与える型推論java.lang.Stringを読みましたがscala.Predef.String、それでも特定の問題の解決策を思い付くことができませんでした。

何か案は?

編集:これが、 私がhttp://www.playframework.org/documentation/api/2.0/scala/play/api/libs/iteratee/Iteratee.htmlStringの代わりに書いたものだけを実装しようとした最初の試みですT。(Tコンパイルすると、それは理にかなっています!)私の失敗。明らかに、私はすべての型パラメーターに少し圧倒されました。

val stream = WS.url("url").get({ headers =>
  (new Iteratee[Array[Byte], String] {
    def fold[T](done: (String, Input[Array[Byte]]) => Promise[T],
                cont: (Input[Array[Byte]] => Iteratee[Array[Byte], String]) => Promise[T],
                error: (String, Input[Array[Byte]]) => Promise[T]): Promise[T] =
    {
      done("something", Input.Empty)
    }
  })
})

よろしく、ヘンドリック

4

2 に答える 2

9

あなたが書くとき:

def fail[String](fn: (String) => Unit) = fn("")

角かっこで囲まれたtypeパラメーターはString任意の名前であり、この場合、scalaまたはjava文字列を非表示にします。これは完全に同等です:

def fail[T](fn: (T) => Unit) = fn("")

タイプを文字列に制限する場合は、次のように記述する必要があります。

def fail(fn: (String) => Unit) = fn("")

また、scala文字列とjava文字列で機能します(同じであるため)。

于 2012-04-05T12:06:35.773 に答える
1

この問題は、JavaとScalaの文字列とは何の関係もありません。

この行では、完全に新しいタイプパラメータを定義し、Stringという名前を付けていますdef fail[String](fn: (String) => Unit) = fn("")。これは一般的な定義を覆い隠します。

タイプを抽象化する場合は、タイプパラメータが必要です。この例ではこれを行っていないためfail、これを削除する必要があります。

タイプパラメータを使用するものをオーバーライドする場合は、次のclassレベルでこれを指定する必要があります。

class A extends B[String]

foldIterateeのコードを見ると、さまざまなdonecontおよびerror関数を使用して実装しようとしていると思います。Foldには、return型で使用される型パラメータが1つしかないため、これがどこから来るのかわかりません。入力型パラメーターはクラスで指定されるため、拡張する場合はIteratee[String, Unit]これらを指定する必要があります。

于 2012-04-05T12:09:31.443 に答える