reflection - kotlin 别名属性委托(delegate)抛出异常

标签 reflection properties delegates kotlin

我想将别名属性添加到 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()而不是 lengthObject[] .
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/

相关文章:

spring - 在 Spring 中将默认属性值指定为 NULL

c# - SWIG 中的委托(delegate) - C#

macos - NStoolbar 重新加载/刷新

c# - Action<T> 委托(delegate)与与处置相关的事件处理程序

java - 泛型实现理解?

java - 如何将 getConstructor 与泛型类一起使用?

c# - 是否可以从基础对象的列表中访问子对象属性?

javascript - 使用字符串变量作为对象字段

javascript - 如何以编程方式检查 JavaScript 作用域链?

oracle - 按名称获取 Oracle PL/SQl 变量属性(PL/SQL 中的反射)