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

标签 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 在这里期望什么样的字符串?

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

我尝试了 def failed[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)
    }
  })
})

问候, 亨德里克

最佳答案

当你写下:

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/

相关文章:

f# - 递归调用的函数类型推断

scala - 如何在 spark-shell 中设置 aws access key 和 aws secret key

multithreading - Play Framework : thread-pool-executor vs fork-join-executor

scala - 如何在相对包导入中引用父包?

scala - 在 Scala 中将函数参数定义为 "var"?

java - 如何将方法重构为仅接受类型子集的通用方法?

java - 推断泛型类中的参数类型,这些参数类型是所提供参数的嵌套泛型类型

未强制执行 Java 接口(interface)

c# - 尽管 intellisense 列出了定义,但找不到定义?

c++ - auto 和 decltype 的关系