Можно ли специализировать общие функции (или класс) в Scala? Например, я хочу написать общую функцию, которая записывает данные в ByteBuffer:
def writeData[T](buffer: ByteBuffer, data: T) = buffer.put(data)
Но поскольку метод put принимает только байт и помещает его в буфер, мне нужно специализировать его для Ints and 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? Я ценю вашу помощь заранее!