如何编写一个包含任何成员数组的类

时间:2014-03-26 08:22:34

标签: scala

我正在尝试使用scala优雅地编写以下代码:

case class Foo(type: String, value: Array[Byte])

value成员包含一个可以是不同类型的数组。例如,type = "Double" 它应该存储Array[Double]type = "Float"应该存储Array[Float]等等。目前,我将我的Array [T]转换为Array [Byte],但它不是很方便。是否可以为我的case类创建一个参数,并使用具体类型

设置该值
value: Array[Type] = some: Array[ConcreteType]

最佳

2 个答案:

答案 0 :(得分:2)

在Scala类型系统中无法准确表达您想要的内容,因为它需要dependent types。但是,你可以做一些非常相似的事情:

case class Foo[T: ClassTag](innerArray: Array[T]) {
  val classTag = implicitly[ClassTag[T]]
}

这样你就能做到这样的事情:

scala> :paste
// Entering paste mode (ctrl-D to finish)

    case class Foo[T: ClassTag](innerArray: Array[T]) {
      val classTag = implicitly[ClassTag[T]]
    }

// Exiting paste mode, now interpreting.

defined class Foo

scala> Foo(Array[Int](1, 2, 3))
res0: Foo[Int] = Foo([I@17160134)

scala> res0.classTag.runtimeClass.getSimpleName
res1: String = int

了解Scala如何自动为您提供ClassTag。使用ClassTag您将能够恢复类名,此外,Scala会强制ClassTag完全对应T而不是其他类型。

答案 1 :(得分:0)

您可以在案例类定义中使用类型参数:

    case class Foo[T](typeName: String, innerArray: Array[T])

    val intArray: Array[Int] = Array(1,2,3)
    val foo = Foo("foo", intArray)

    val stringArray: Array[String] = Array("a", "b", "c")
    val bar = Foo("bar", stringArray)