我想将别名属性添加到kotlin中的某个类中,该类只将自己委托给一些已存在的属性
然后我发明了一个名为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)
答案 0 :(得分:2)
这似乎是一个错误。以下程序也崩溃了:
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。