A класс типов будет выглядеть следующим образом:
trait ByteSize[T] {
def tSize: Int
}
object ByteSize {
implicit final val IntByteSize: ByteSize[Int] =
new ByteSize[Int] {
override final val tSize: Int = 4
}
implicit final val LongByteSize: ByteSize[Long] =
new ByteSize[Long] {
override final val tSize: Int = 8
}
// Other instances.
}
object syntax {
object bytes {
implicit class ArrayOps[T](private val arr: Array[T]) extends AnyVal {
final def allocateByteBuffer(implicit ev: ByteBuffer[T]): ByteBuffer =
ByteBuffer.allocate(ev.tSize * array.length)
}
}
}
, который вы можете использовать следующим образом:
import syntax.bytes._
val arr: Array[Int] = ???
val byteBuffer = arr.allocateByteBuffer
Вы можете даже предоставить более полезные методы расширения, такие как вместо того, чтобы просто выделять ByteBuffer , вы можете заполнить его напрямую.
Обратите внимание, помните, классы типов управляются типом, поэтому разрешаются при компиляции время. Если вы не знаете тип вашего массива, тогда это лучшее совпадение с образцом.
Возможно, вы захотите посмотреть, сможете ли вы реорганизовать свой код, чтобы он стал более строгим, поскольку Любой , вообще, считается кодовым запахом. Но если вы не можете или это слишком много для выгоды, классы типов просто не подходят для этой работы.