kotlin别名属性委托抛出异常

时间:2017-06-07 08:48:25

标签: reflection properties delegates kotlin

我想将别名属性添加到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)

1 个答案:

答案 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