kotlin别名属性代表抛出异常
我想将别名属性添加到kotlin中的一些类,这些类只是将自己委托给一些已有的属性
那么我发明了一个名为别名的方法来做到这一点,不幸的是会导致一个异常
val <T> Array<T>.length by alias(Array<T>::size) val <T> Collection<T>.length by alias(Collection<T>::size) fun <R, T> alias(alias: KProperty1<R, T>) = object : ReadOnlyProperty<R, T> { override operator fun getValue(thisRef: R, property: KProperty<*>): T { return alias.get(thisRef) } }
在异常堆栈之后
java.lang.NoSuchMethodError: [Ljava.lang.Object;.getSize()I at kt.ruby.ArrayKt$length$2.get(Array.kt:34) at kt.ruby.ArrayKt$alias$1.getValue(Array.kt:40) at kt.ruby.ArrayKt.getLength(Array.kt)
这似乎是一个错误。 以下程序也崩溃:
fun main(args: Array<String>) { val a: KProperty1<Array<String>, Int> = Array<String>::size a.get(args) }
这里的问题是,生成的KProperty1<Array<String>>
在Object[]
上引用getSize()
而不是length
。
final class MainKt$main$a$1 extends PropertyReference1 { public static final KProperty1 INSTANCE = new MainKt$main$a$1(); public String getName() { return "size"; } public String getSignature() { return "getSize()I"; } public KDeclarationContainer getOwner() { return Reflection.getOrCreateKotlinClass(Object[].class); } @Nullable public Object get(@Nullable Object receiver) { return Integer.valueOf(((String[])receiver).getSize()); } }
请参阅KT-15618 。