以下是代码片段 –
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)
会工作,因为它会从最初读取字符串类型.