bencode Scala任何类型

时间:2014-12-04 01:21:08

标签: scala

我正在将用Python编写的代码移植到Scala上。

此python代码[0,{}]创建一个整数和字典的列表。

本例中的字典将包含字符串,但值可以是int或字符串。

我想在Scala中做类似的事情。我相信我必须做类似的事情:

List[Any] = (<int>, scala.collection.mutable.Map[String, Any](...))

我计划对此列表进行编码,因此“任意”的基本类型很重要。如何更改类型以便列表可以进行编码?

2 个答案:

答案 0 :(得分:1)

在大多数情况下,在Scala中使用Any不是正确的做法。

由于您的问题是地图值可以是IntString,而不是尝试使用它们的公共类型(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

依旧......