Проблема с вашим дизайном заключается в том, что putInt
позволяет пропускать только Int, но вы пытаетесь передать как Int, так и Double, что не сработает.
Распространенным способом проектирования является кэширование. функция put вместо типа класса, например
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))
Вы можете даже превратить это в неявный класс, чтобы сделать его более симпатичным, или даже превратить его в класс типов, но основная концепция заключается в кэшировании функция, помня о функциональном программировании.