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

def fn[String]似乎破坏了Scala/java.lang.String的兼容性,scala,generics,type-inference,Scala,Generics,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("") } Scala在这里期望什

你好,这里是堆栈溢出

我希望你能帮我回答我的第一个问题:)

所以我对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],找到了。

我确实读过这篇文章,它对
java.lang.String
scala.Predef.String
进行了很好的解释,但我仍然无法为我的具体问题找到解决方案

有什么想法吗

EDIT:这里是我最初尝试实现的方法,我只编写了
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字符串(因为它们是相同的)。

这个问题与java和scala字符串无关

def fail[String](fn:(String)=>Unit)=fn(“”)行中,您定义了一个全新的类型参数并将其命名为String。这掩盖了一般的定义

如果要对类型进行抽象,则需要类型参数。在
fail
示例中,您没有执行此操作,应该删除此操作

如果要重写使用类型参数的内容,则应在
级别指定:

class A extends B[String]

查看Iteratee的代码,我猜您正在尝试使用各种
done
cont
error
函数实现
fold
。Fold只有一个类型参数,用于返回类型,所以我不确定这是从哪里来的。输入类型参数是在类上指定的,因此如果扩展
Iteratee[String,Unit]
则应提供这些参数。

是的,我现在就知道了-argh!对类型进行分派是一种有趣的方法。谢谢这是一个很好的观点,我将删除它。对不起,我的答案写得太快了。太糟糕了,看起来很有趣;(谢谢,现在你说的很明显……:|这个答案是正确的,我选择@submonoid's though来处理我的方法的签名,但我不能实际更改它。@Hendrik-据我所知,签名没有意义。你为什么不能更改它?签名必须是什么?(你可能误解了它必须是什么吗?)添加了上面的原始代码,应该可以解释我的误解。