2012-04-05 16 views
3

你好堆栈溢出,DEF FN [字符串]似乎打破斯卡拉/ java.lang.String中的兼容性

我希望你能帮助我与我的第一个问题在这里:)

所以我m有一个Scala类型推断的问题。这里是代码:

object Problem { 

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

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

} 

斯卡拉期望什么样的字符串?

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

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

我确实读过Scala String vs java.lang.String - type inference,它对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) 
    } 
    }) 
}) 

问候, 亨德里克

回答

9

当你写:

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字符串工作(因为它们是相同)。

+0

非常感谢,现在你说它...:| – Hendrik 2012-04-05 12:16:22

+0

这个答案是正确的,我选择@ submonoid的,虽然我的方法的签名,我实际上不能改变工作。 – Hendrik 2012-04-05 12:18:58

+1

@Hendrik - 就我所知,签名没有任何意义。你为什么不能改变它?签名必须是什么? (你可能会误解它是什么?) – 2012-04-05 12:29:37

1

这个问题与Java vs Scala字符串无关。

在行def fail[String](fn: (String) => Unit) = fn("")您正在定义一个全新的类型参数并将其命名为String。这影响了一般定义。

如果您打算对类型进行抽象,则需要类型参数。您在fail示例中没有这样做,并且应该删除它。

如果您正在覆盖的东西,使用类型参数,那么你应该在class级别指定此:

class A extends B[String] 

望着用于Iteratee的代码,我猜你想实现fold其各种done,conterror功能。折叠只有一个类型参数,用于返回类型,所以我不确定这可能来自哪里。输入类型参数是在类中指定的,因此如果扩展Iteratee[String, Unit],应提供这些参数。

+0

是的,我现在明白了 - 唉!调度这种类型是一种有趣的方法。谢谢! – Hendrik 2012-04-05 12:15:46

+0

这是一个很好的观点,我会删除它。对不起,我的答案写得太快了。 – Submonoid 2012-04-05 12:33:57

+0

太糟糕了,看起来很有趣;( – Hendrik 2012-04-05 12:53:39