【问题标题】:how to instantiate Unit in Scala?如何在 Scala 中实例化 Unit?
【发布时间】:2014-12-21 04:39:54
【问题描述】:

我只想使用一些并发的 Set(似乎根本不存在)。 Java 使用java.util.concurrent.ConcurrentHashMap<K, Void> 来实现该行为。我想在 Scala 中做类似的事情,所以我创建了 Scala HashMap(或 Java ConcurrentHashMap)的实例并尝试添加一些元组:

val myMap = new HashMap[String, Unit]()
myMap + (("myStringKey", Unit))

这当然会导致编译过程崩溃,因为 Unit 是抽象的和最终的。

如何做到这一点?我应该改用Any/AnyRef 吗?我必须确保没有人插入任何值。

感谢您的帮助

【问题讨论】:

  • 注意,java.util.concurrent.ConcurrentHashMap<K, void> 是错误的。 Void 类型(注意大写V)只能接受null 值,但the documentation for ConcurrentHashMap 明确禁止映射中的null 键/值。这通常是如何实现的,ConcurrentHashMap<K, Boolean>,使用常量Boolean.TRUE 作为值。 (使用常量 Boolean.TRUE 可确保您不会为地图中的每个条目创建新的 Boolean 实例。)
  • 更正(void -> Void)继续进行,使用Boolean.TRUE 是个不错的技巧,谢谢
  • 你确定你应该在那里使用Unit吗? Option 或自定义 ADT(密封案例类族)怎么样?
  • 我不确定,我只需要并发集 - 我使用了布尔技巧,它工作正常。
  • 这个问题确实是一个非常有效的问题,独立于给定的上下文和用例。您需要一种在函数式编程语言中实例化 Unit 类型的方法,因为它是在其上创建 ADT 和标识函数的非常重要的构建块。

标签: java scala concurrency hashmap set


【解决方案1】:

你可以只使用类型为Unit()

scala> import scala.collection.mutable.HashMap
import scala.collection.mutable.HashMap

scala> val myMap = new HashMap[String, Unit]()
myMap: scala.collection.mutable.HashMap[String,Unit] = Map()

scala> myMap + ("myStringKey" -> ())
res1: scala.collection.mutable.Map[String,Unit] = Map(myStringKey -> ())

这是来自Unit.scala的评论:

Unit() 类型的值只有一个,在底层运行时系统中没有任何对象表示。

【讨论】:

  • 也许补充一点,当您说val x = () 时,您得到的是装箱值scala.runtime.BoxedUnit.UNIT。此外,() 具有类型 Unit: 说“返回类型”可能会使人们感到困惑,因为函数应用程序中使用了 paren。单位值看起来像一个空元组,而不是一个奇怪的应用程序。
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多