你好,堆栈溢出,
我希望你能帮助我解决我的第一个问题:)
所以我在 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 在这里期望什么样的字符串?
请注意,这是解释我的问题的最小示例。当我尝试实现一个更复杂的接口(interface)(准确地说是 Play 的 Iteratee)时,最初的问题出现了,所以,不,忽略 [String]
不是一个选项。 (如果有人认为实际代码会有帮助,我会提供它。)
我尝试了 def failed[java.lang.String] ...
但随后它显示 expected ],found .
。
我确实读过Scala String vs java.lang.String - type inference它对 java.lang.String
与 scala.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)
}
})
})
问候, 亨德里克
最佳答案
当你写下:
def fail[String](fn: (String) => Unit) = fn("")
方括号 String
之间的类型参数只是一个任意名称,在您的情况下,它将隐藏 scala 或 java 字符串。它完全等同于:
def fail[T](fn: (T) => Unit) = fn("")
如果你想将类型限制为字符串,你只需编写:
def fail(fn: (String) => Unit) = fn("")
它适用于 scala 和 java 字符串(因为它们是相同的)。
关于scala - def fn[String] 似乎破坏了 Scala/java.lang.String 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10028191/