繁体   English   中英

在变量中保持 scala 类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM