这是代码片段-
import java.util.concurrent.LinkedBlockingQueue
def main(args:Array[String]) {
val queue=new LinkedBlockingQueue
queue.put("foo")
}
这给了我-
错误:类型不匹配;
找到:java.lang.String("foo")
要求:无
queue.add("foo")
我的理解是因为我没有指定进入队列的元素的类型。如果是这样,我们如何在 Scala 中为 LinkedBlockingQueue 指定类型而不是默认的通用类型?
最佳答案
当您不提供类型签名但需要一个时,Scala 会使用最严格的签名。由于 Nothing
是所有限制性最强的(nothing 可以是 Nothing
!),Scala 选择 LinkedBlockingQueue[Nothing]
。
但在这种情况下,限制意味着您实际上不能将任何东西放入这个高度限制的队列中。
正如您已经发现的那样,解决方案是指定集合中类的类型:
val queue = new LinkedBlockingQueue[String]
但请注意,在其他情况下,类型推断器可以通过遵循“尽可能严格”的规则找出正确的类型。例如,如果 initial
是另一个类型为包含字符串的 Java 集合,
val queue = new LinkedBlockingQueue(initial)
会正常工作,因为它会从 initial
中读取 String
类型。
关于java.util.concurrent.LinkedBlockingQueue put 方法在 Scala 中需要 Nothing 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429087/