我正在将用Python编写的代码移植到Scala上。
此python代码[0,{}]
创建一个整数和字典的列表。
本例中的字典将包含字符串,但值可以是int或字符串。
我想在Scala中做类似的事情。我相信我必须做类似的事情:
List[Any] = (<int>, scala.collection.mutable.Map[String, Any](...))
我计划对此列表进行编码,因此“任意”的基本类型很重要。如何更改类型以便列表可以进行编码?
答案 0 :(得分:1)
在大多数情况下,在Scala中使用Any
不是正确的做法。
由于您的问题是地图值可以是Int
或String
,而不是尝试使用它们的公共类型(Any),请创建自己的新类型层次结构来表示可能性:< / p>
sealed trait BData
case class BInt(i: Int) extends BData
case class BString(s: String) extends BData
现在,您的地图的类型签名为Map[String, BData]
使用BData
作为&#34;基础类型&#34;比使用Any
更好,因为它没有歧义。它有两个子类;与Any相比,您的值可能是List[(Foo, Bar)]
,对于所有编译器都知道。
答案 1 :(得分:0)
我会更进一步地回答迪伦的问题
Scala有强大的类型系统,你应该使用它。
当你在java中使用Any之类的Any时,你会丢失类型
您应该定义类型并让编译器为您工作:
sealed trait BData[T] {
val value: T
}
implicit class BInt(val value: Int) extends BData[Int]
implicit class BString(val value: String) extends BData[String]
隐含的&#39;声明使编译器&#34;转换&#34;你的类型,所以你可以像这样使用它:
val bDataMap = scala.collection.mutable.Map[String, BData[_]]()
val l = List((1, bDataMap))
l(0)._2 += ("myKey1" -> "Str")
l(0)._2 += ("myKey2" -> 2)
l(0)._2("myKey1").value
依旧......