質問に答える:Number
という汎用関数を使用できます。次に、Number
のサブタイプを受け入れます。そして、あなたが他の数値型に値を変換することができます
fun boo(x: Number) {
val y = x.toLong()
println(y is Long)
}
本の唯一の欠点はオートボクシングされ、それはあなたの場合には関係ないはず。
投稿したコードについて:この状況を引き起こすアーキテクチャ上のエラーがあると思います。ここにあなたのAPIは、あまりにも多くの詳細がなくてです:
interface Source {
fun read(address: Long, data: Pointer, bytesToRead: Int)
fun read(address: Int, data: Pointer, bytesToRead: Int) = read(address.toLong(), data, bytesToRead)
fun read(address: Long, data: Memory, bytesToRead: Int = data.size().toInt()) = read(address, data as Pointer, bytesToRead)
fun read(address: Int, data: Memory, bytesToRead: Int = data.size().toInt()) = read(address.toLong(), data, bytesToRead)
fun read(address: Long, struct: Struct, bytesToRead: Int = struct.size()) = read(address, struct.pointer, bytesToRead)
fun read(address: Int, struct: Struct, bytesToRead: Int = struct.size()) = read(address.toLong(), struct, bytesToRead)
fun read(address: Long, bytesToRead: Int): Memory = TODO()
fun read(address: Int, bytesToRead: Int) = read(address.toLong(), bytesToRead)
fun byte(address: Long, offset: Long = 0) = read(address, 1).getByte(offset)
fun byte(address: Int, offset: Long = 0) = byte(address.toLong(), offset)
fun short(address: Long, offset: Long = 0) = read(address, 2).getShort(offset)
fun short(address: Int, offset: Long = 0) = short(address.toLong(), offset)
fun char(address: Long, offset: Long = 0) = read(address, 2).getChar(offset)
fun char(address: Int, offset: Long = 0) = char(address.toLong(), offset)
fun int(address: Long, offset: Long = 0) = read(address, 4).getInt(offset)
fun int(address: Int, offset: Long = 0) = int(address.toLong(), offset)
fun long(address: Long, offset: Long = 0) = read(address, 8).getLong(offset)
fun long(address: Int, offset: Long = 0) = long(address.toLong(), offset)
fun float(address: Long, offset: Long = 0) = read(address, 4).getFloat(offset)
fun float(address: Int, offset: Long = 0) = float(address.toLong(), offset)
fun double(address: Long, offset: Long = 0) = read(address, 8).getDouble(offset)
fun double(address: Int, offset: Long = 0) = double(address.toLong(), offset)
fun boolean(address: Long, offset: Long = 0) = byte(address, offset).unsign() > 0
fun boolean(address: Int, offset: Long = 0) = boolean(address.toLong(), offset)
fun write(address: Long, data: Pointer, bytesToWrite: Int)
fun write(address: Int, data: Pointer, bytesToWrite: Int) = write(address.toLong(), data, bytesToWrite)
fun write(address: Long, data: Memory, bytesToWrite: Int = data.size().toInt())
= write(address, data as Pointer, bytesToWrite)
fun write(address: Int, data: Memory, bytesToWrite: Int = data.size().toInt())
= write(address.toLong(), data, bytesToWrite)
fun write(address: Long, struct: Struct, bytesToWrite: Int = struct.size())
= write(address, struct.pointer, bytesToWrite)
fun write(address: Int, struct: Struct, bytesToWrite: Int = struct.size())
= write(address.toLong(), struct, bytesToWrite)
// ...
}
このAPIはaddress
ためLong
で動作しますが、また、何らかの理由でInt
受け付けます。私はあなたが1つ(e.i Long
)を覗いて、消費者にInt
をLong
に変換することを心配させるべきだと思います。これはAPIの責任ではありません。また、消費者がにLong
を使用するAPIを使用している場合、彼は通常Long
を使用してその側のアドレスも操作します。これにより、APIが簡素化され、Int
〜Long
とバックコンバージョンが節約され、パフォーマンスが向上します。
ところで、なぜJNAの代わりにJNRを使用しないのですか? JNRははるかに高速です。 – SerCe
@ SerCe直接マッピングされたJNAに対するパフォーマンステストでは、パフォーマンスの向上はほとんどなく、パフォーマンスの低下が見られます。 – Jire