確認はKotlin 1.4.32
で行いました。
TL;DR
-
KFunction
を呼び出す場合、unsigned integers
型を渡す必要が有る -
Java
のConsturctor
/Method
を呼び出す場合、プリミティブ型を渡す必要が有る- ただし、符号付きの値が
unsigned
扱いになるため注意が必要
- ただし、符号付きの値が
確認した内容
以下のコンストラクタの呼び出しで確認を行いました。
@ExperimentalUnsignedTypes
data class Temp constructor(
val uByte: UByte,
val uShort: UShort,
val uInt: UInt,
val uLong: ULong
)
確認に用いたコードは以下の通りです(Java
のConstructor
に渡しているnull
はunsigned integers
を入れた時に要求されるDefaultConstructorMarker
です)。
結果はコメントに記述した通りです。
// Kotlin上の型で呼べるか
val k0 = kConstructor.call(1.toUByte(), 2.toUShort(), 3.toUInt(), 4L.toULong())
// java.lang.IllegalArgumentException: argument type mismatchになる
// val c0 = constructor.newInstance(1.toUByte(), 2.toUShort(), 3.toUInt(), 4L.toULong(), null)
// プリミティブ型で呼べるか
// java.lang.IllegalArgumentException: object is not an instance of declaring classになる
// val k1 = kConstructor.call(1.toByte(), 2.toShort(), 3, 4L)
val c1 = constructor.newInstance(1.toByte(), 2.toShort(), 3, 4L, null)
補足
Java
のConstructor
を呼び出す際、例えば負の値を渡すと以下のようになるため注意が必要です。
val c1 = constructor.newInstance((-1).toByte(), 2.toShort(), 3, 4L, null)
println(c1.uByte) // -> 255