def fn[String]似乎破坏了Scala/java.lang.String的兼容性
你好,这里是堆栈溢出 我希望你能帮我回答我的第一个问题:) 所以我对Scala类型推断有一个问题。代码如下: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在这里期望什
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-据我所知,签名没有意义。你为什么不能更改它?签名必须是什么?(你可能误解了它必须是什么吗?)添加了上面的原始代码,应该可以解释我的误解。