java.util.concurrent.LinkedBlockingQueue put方法在Scala中需要Nothing作为参数

use*_*633 7 java scala

以下是代码片段 -

import java.util.concurrent.LinkedBlockingQueue  

def main(args:Array[String]) {  
    val queue=new LinkedBlockingQueue  
    queue.put("foo")  
}
Run Code Online (Sandbox Code Playgroud)

这给了我 -

错误:类型不匹配;
发现:需要java.lang.String("foo")
:Nothing
queue.add("foo")

我的理解是因为我没有指定进入队列的元素的类型.如果是这种情况,我们如何在Scala中为LinkedBlockingQueue指定类型而不是默认的通用类型?

Rex*_*err 3

当您不提供类型签名但需要类型签名时,Scala 会使用尽可能严格的签名。由于Nothing是所有限制中最严格的(没有什么可以Nothing!),Scala 选择LinkedBlockingQueue[Nothing]

但在这种情况下,限制性意味着您实际上无法将任何内容放入这个高度限制性的队列中。

正如您已经发现的,解决方案是指定集合中类的类型:

val queue = new LinkedBlockingQueue[String]
Run Code Online (Sandbox Code Playgroud)

但请注意,类型推断器可以通过遵循“尽可能限制”的规则在其他情况下找出正确的类型。例如,如果initial是另一个类型为包含字符串的 Java 集合,

val queue = new LinkedBlockingQueue(initial)
Run Code Online (Sandbox Code Playgroud)

String就会起作用,因为它会从 中读取类型initial