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

标签 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")

我的理解是因为我没有指定进入队列的元素的类型。如果是这样,我们如何在 Scala 中为 LinkedBlockingQueue 指定类型而不是默认的通用类型?

最佳答案

当您不提供类型签名但需要一个时,Scala 会使用最严格的签名。由于 Nothing 是所有限制性最强的(nothing 可以是 Nothing!),Scala 选择 LinkedBlockingQueue[Nothing]

但在这种情况下,限制意味着您实际上不能将任何东西放入这个高度限制的队列中。

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

val queue = new LinkedBlockingQueue[String]

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

val queue = new LinkedBlockingQueue(initial)

会正常工作,因为它会从 initial 中读取 String 类型。

关于java.util.concurrent.LinkedBlockingQueue put 方法在 Scala 中需要 Nothing 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429087/

相关文章:

java - JFace 消息对话框 : inline text coloring

java - Stateless EJB 使用 EJB Schedule 保持状态

java - 如何从二进制字符串中提取整数并将其保存在矩阵中?

postgresql - 在 slick, scala 中处理 Postgres json 数据类型

java - 作为 Java 的 Scala 片段

scala - 卡夫卡流0.10.1 "Failed to flush state store"

java - Maven – 文档中没有引用语法约束(DTD 或 XML Schema)

java - 从给定 URL 下载所有图像并将其保存到桌面无法完全正常工作

scala - 扩展共同特征的无形 HList 类型

scala - 构建和使用自定义 scala-library 来扩展原始数据类型