Scala(或Java)中泛型函数的专用化
是否可以在 Scala 中专门化泛型函数(或类)?例如,我想编写一个将数据写入字节缓冲区的泛型函数:
def writeData[T](buffer: ByteBuffer, data: T) = buffer.put(data)
但是由于 put 方法只需要一个字节并将其放入缓冲区中,因此我需要将其专门用于 Ints 和 Longs,如下所示:
def writeData[Int](buffer: ByteBuffer, data: Int) = buffer.putInt(data)
def writeData[Long](buffer: ByteBuffer, data: Long) = buffer.putLong(data)
并且它不会编译。当然,我可以分别编写3个不同的函数 writeByte,writeInt 和 writeLong,但假设数组还有另一个函数:
def writeArray[T](buffer: ByteBuffer, array: Array[T]) {
for (elem <- array) writeData(buffer, elem)
}
如果没有专门的 writeData 函数,这将不起作用:我必须部署另一组函数 writeByteArray,writeIntArray,writeLongArray。每当我需要使用依赖于类型的写入函数时,必须以这种方式处理这种情况并不酷。我做了一些研究,一个可能的解决方法是测试参数的类型:
def writeArray[T](buffer: ByteBuffer, array: Array[T]) {
if (array.isInstanceOf[Array[Byte]])
for (elem <- array) writeByte(buffer, elem)
else if (array.isInstanceOf[Array[Int]])
for (elem <- array) writeInt(buffer, elem)
...
}
这可能有效,但它的效率较低,因为类型检查是在运行时完成的,这与专用函数版本不同。
所以我的问题是,在Scala或Java中解决这种问题的最理想和首选的方法是什么?我提前感谢您的帮助!