java.util.concurrent.LinkedBlockingQueue put方法在Scala中不需要任何参数
下面是一段代码-java.util.concurrent.LinkedBlockingQueue put方法在Scala中不需要任何参数,java,scala,Java,Scala,下面是一段代码- import java.util.concurrent.LinkedBlockingQueue def main(args:Array[String]) { val queue=new LinkedBlockingQueue queue.put("foo") } 这给了我- 错误:类型不匹配 找到:java.lang.String(“foo”) 必填项:无 queue.add(“foo”) 我的理解是因为我没有指定进入队列的元素的类型。如果是
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指定类型,而不是默认的泛型类型?我猜对了。必须如图所示指定类型-
val queue=new LinkedBlockingQueue[String]
Java原始类型是向后兼容性的让步,它们的使用被认为是糟糕的风格。在Scala中,您没有原始类型,因此必须指定它们,或者类型推断器必须能够推断它们。请注意,也可以在左侧指定参数化类型:
val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue()
这在这里没有多大意义,但如果您想为变量使用不同的类型(例如,
Queue[String]
),这一点很重要。当您不提供类型签名,但需要一个类型签名时,Scala会使用尽可能严格的签名。因为没有任何内容
是最严格的(什么都不能是nothing
!),Scala选择LinkedBlockingQueue[nothing]
但在这种情况下,限制性意味着您实际上无法将任何内容放入这个高度限制的队列中
正如您已经发现的,解决方案是指定集合中类的类型:
val queue = new LinkedBlockingQueue[String]
但是请注意,类型推断器可以通过遵循“尽可能严格”的规则在其他情况下找出正确的类型。例如,如果initial
是另一个类型为包含字符串的Java集合
val queue = new LinkedBlockingQueue(initial)
它可以正常工作,因为它可以从
初始值
读取字符串
类型。对于并发收集,您可以使用wich有工厂
Scala示例和请注意,默认类型不是泛型。相反,它是可能的最特定类型。:-)