def fn [String]似乎打破了Scala/java.lang.String的兼容性

3 generics scala type-inference

你好堆栈溢出,

我希望你能帮我解决我的第一个问题:)

所以我对Scala类型推断有问题.这是代码:

object Problem {

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

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

}
Run Code Online (Sandbox Code Playgroud)

Scala期待什么样的字符串?

请注意,这是解释我的问题的最小示例.当我试图实现一个更复杂的界面(确切地说是Play的Iteratee)时出现了原始问题,所以,不,遗漏[String]不是一个选项.(如果有人认为实际的代码会有所帮助,我会提供它.)

我试过def fail[java.lang.String] ...但是然后它说expected ], found ..

我看过斯卡拉字符串VS java.lang.String中-类型推断这给了很好的解释java.lang.Stringscala.Predef.String,但我还是没能拿出我的具体问题的解决方案.

有任何想法吗?

编辑:所以这是我尝试实现http://www.playframework.org/documentation/api/2.0/scala/play/api/libs/iteratee/Iteratee.html的原始尝试, 只是我写的String而不是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)
    }
  })
})
Run Code Online (Sandbox Code Playgroud)

此致,亨德里克

par*_*tic 9

当你写:

def fail[String](fn: (String) => Unit) = fn("")
Run Code Online (Sandbox Code Playgroud)

方括号之间的类型参数String只是一个任意名称,在您的情况下,将隐藏scala或java字符串.它完全等同于:

def fail[T](fn: (T) => Unit) = fn("")
Run Code Online (Sandbox Code Playgroud)

如果要将类型约束为字符串,则只需编写:

def fail(fn: (String) => Unit) = fn("")
Run Code Online (Sandbox Code Playgroud)

它适用于scala和java字符串(因为它们是相同的).