![](/img/trans.png)
[英]Scala: Declare a variable for holding a function (lambda) without immediate assignment
[英]Holding scala type in variable
我需要动态地将类型参数传递给asInstanceOf
。 我怎样才能做到这一点?
这是我能做到的最好的:
val fieldLength = 4
var dType: Class[Any] = null
fieldLength match {
case 4 =>
dType = Int.getClass
case 8 =>
dType = Double.getClass
}
val byteBuffer = ByteBuffer.allocate(fieldLength)
.putInt(row.get(i).asInstanceOf[dType])
但显然这段代码无法编译。
您设计的问题是putInt
只允许通过 Int,但您试图同时通过 Int 和 Double,这是行不通的。
一种常见的设计方法是缓存 put function 而不是 class 类型,例如
val fieldLength = 4
val putObj = (buf: ByteBuffer, obj: Any) => fieldLength match {
case 4 =>
buf.putInt(obj.asInstanceOf[Int])
case 8 =>
buf.putDouble(obj.asInstanceOf[Double])
//other cases or catch all
}
val byteBuffer = putObj(ByteBuffer.allocate(fieldLength), row.get(i))
您甚至可以将其转换为隐式 class 以使其更漂亮,甚至可以将其转换为 class 类型,但核心概念是缓存 function,同时牢记函数式编程。
这里的问题是asInstanceOf
不会起作用,除非get
返回的值的类型是您期望的类型。 因此,为了安全起见,最好match
该值的类型:
val byteBuffer = ByteBuffer.allocate(fieldLength)
row.get(i) match {
case int: Int =>
byteBuffer.putInt(i)
case double: Double =>
byteBuffer.putDouble(double)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.