我正在尝试使用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]
最佳
答案 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)