我想将别名属性添加到 kotlin 中的某个类,它只是将自己委托(delegate)给一些现有的属性
然后我发明了一种名为 alias 的方法来这样做,不幸的是这会导致异常
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>>
引用资料 getSize()
而不是 length
在 Object[]
.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为了这。
关于reflection - kotlin 别名属性委托(delegate)抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44407836/