首页 文章

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

提问于
浏览
7

以下是代码片段 -

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指定类型而不是默认的通用类型?

4 回答

  • 2

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

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

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

    val queue = new LinkedBlockingQueue[String]
    

    但请注意,类型推断器可以通过遵循"as restrictive as possible"规则在其他情况下找出正确的类型 . 例如,如果 initial 是另一个类型为包含字符串的Java集合,

    val queue = new LinkedBlockingQueue(initial)
    

    只会工作,因为它会从 initial 读取 String 类型 .

  • 3

    对于并发收集,您可以使用具有GenericMapMaker工厂的google collections (Guava) .

    Scala示例herehere

  • 1

    我猜对了 . 必须如图所示指定类型 -

    val queue=new LinkedBlockingQueue[String]
    
  • 1

    Java原始类型是向后兼容的让步,它们的使用被认为是坏的风格 . 在Scala中,您没有原始类型,因此您必须指定它们,或者类型推断器必须能够推断它们 . 请注意,您也可以在左侧指定参数类型:

    val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue()
    

    这在这里没有多大意义,但如果你想要一个不同的类型(例如 Queue[String] 为你的变量),这很重要 .

相关问题