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

前端之家收集整理的这篇文章主要介绍了java.util.concurrent.LinkedBlockingQueue put方法在Scala中需要Nothing作为参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下是代码片段 –
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!),Scala选择LinkedBlockingQueue [Nothing].

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

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

val queue = new LinkedBlockingQueue[String]

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

val queue = new LinkedBlockingQueue(initial)

会工作,因为它会从最初读取字符串类型.

猜你在找的Java相关文章