以下是代码片段 -
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 回答
当您不提供类型签名但需要一个时,Scala会使用最严格的签名 . 由于
Nothing
是最严格的(没有什么可以Nothing
!),Scala选择LinkedBlockingQueue[Nothing]
.但在这种情况下,限制性意味着您实际上无法将任何内容放入此限制性高的队列中 .
正如您已经发现的那样,解决方案是指定集合中的类类型:
但请注意,类型推断器可以通过遵循"as restrictive as possible"规则在其他情况下找出正确的类型 . 例如,如果
initial
是另一个类型为包含字符串的Java集合,只会工作,因为它会从
initial
读取String
类型 .对于并发收集,您可以使用具有GenericMapMaker工厂的google collections (Guava) .
Scala示例here和here
我猜对了 . 必须如图所示指定类型 -
Java原始类型是向后兼容的让步,它们的使用被认为是坏的风格 . 在Scala中,您没有原始类型,因此您必须指定它们,或者类型推断器必须能够推断它们 . 请注意,您也可以在左侧指定参数类型:
这在这里没有多大意义,但如果你想要一个不同的类型(例如
Queue[String]
为你的变量),这很重要 .