Java 在Scala中使用泛型数据类型值定义映射

Java 在Scala中使用泛型数据类型值定义映射,java,scala,scala-option,Java,Scala,Scala Option,我必须在Scala中构造映射,这样我就可以从Java代码调用中收集所有数据。可能的值有String、Integer、Double和null。有没有办法用Scala来表示这张地图?我试图有如下选择,但不确定它的类型应该是什么 def createScalaMapaFromJavaBean(): Map[String, Option[XXX]] = { val someJavaBean = getMyBeanValues() Map( "key1" -> Option(some

我必须在Scala中构造映射,这样我就可以从Java代码调用中收集所有数据。可能的值有
String
Integer
Double
null
。有没有办法用Scala来表示这张地图?我试图有如下选择,但不确定它的类型应该是什么

def createScalaMapaFromJavaBean(): Map[String, Option[XXX]] = {
  val someJavaBean = getMyBeanValues()
  Map(
    "key1" -> Option(someJavaBean.getAgeAsInteger()),
    "key2" -> Option(someJavaBean.getSalaryAsDouble()),
    "key3" -> Option(someJavaBean.getNameAsString()),
    "key4" -> Option(someJavaBean.getSomeFieldValuesAsNull()
 )
}

以类型安全的方式执行此操作很容易:

sealed trait MyType

case object MyNil extends MyType
case class MyInt(i: Int) extends MyType
case class MyDouble(d: Double) extends MyType
case class MyString(s: String) extends MyType
然后您的代码变成:

def createScalaMapaFromJavaBean(): Map[String, MyType] = {
  val someJavaBean = getMyBeanValues()
  Map(
    "key1" -> MyInt(someJavaBean.getAgeAsInteger()),
    "key2" -> MyDouble(someJavaBean.getSalaryAsDouble()),
    "key3" -> MyString(someJavaBean.getNameAsString()),
    "key4" -> MyNil
  )
}
您可能会像下面这样将数据取回:

map.get(key) match {
  case Some(MyInt(i))    => // logic for ints
  case Some(MyDouble(d)) => // logic for doubles
  case Some(MyString(s)) => // logic for strings
  case Some(MyNil)       => // logic for nulls
  case None              => // logic for "key not found"
}

以类型安全的方式执行此操作很容易:

sealed trait MyType

case object MyNil extends MyType
case class MyInt(i: Int) extends MyType
case class MyDouble(d: Double) extends MyType
case class MyString(s: String) extends MyType
然后您的代码变成:

def createScalaMapaFromJavaBean(): Map[String, MyType] = {
  val someJavaBean = getMyBeanValues()
  Map(
    "key1" -> MyInt(someJavaBean.getAgeAsInteger()),
    "key2" -> MyDouble(someJavaBean.getSalaryAsDouble()),
    "key3" -> MyString(someJavaBean.getNameAsString()),
    "key4" -> MyNil
  )
}
您可能会像下面这样将数据取回:

map.get(key) match {
  case Some(MyInt(i))    => // logic for ints
  case Some(MyDouble(d)) => // logic for doubles
  case Some(MyString(s)) => // logic for strings
  case Some(MyNil)       => // logic for nulls
  case None              => // logic for "key not found"
}

看起来您需要
AnyRef
。您丢失了类型安全性,但看起来您需要
AnyRef
。但是你失去了类型安全