Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.concurrent.LinkedBlockingQueue put方法在Scala中不需要任何参数_Java_Scala - Fatal编程技术网

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示例和

请注意,默认类型不是泛型。相反,它是可能的最特定类型。:-)