如何在 Kotlin 中覆盖 java 类 的属性?

How to override properties of java classes in Kotlin?

Java 代码中的某处有 class ViewHolder:

public static abstract class ViewHolder {
    public final View itemView;
    public ViewHolder(View itemView) { this.itemView = itemView; }
    ....
}

因此,在 Kotlin 中,此 class 的实例包含类型为 View 的只读 属性 itemView。我想像这样创建一个通用的 class ViewHolder<V>

class MyViewHolder<V : View>(itemView: V) : ViewHolder(itemView) {
     override val itemView = super.itemView as V // error: itemView overrides nothing
}

如果我删除 override 修饰符,class 编译正常,但是当我尝试使用 itemView 字段时,我得到 Overload resolution ambiguity 错误。

这里我想要的是让 MyViewHolder class 的 itemView 属性 成为 V 类型,而不是 View .因此,例如,MyViewHolder(TextView(context)).itemView 将是 TextView。有什么办法可以实现吗?

您示例中的 Java class 有一个字段,而不是 属性。访问 Java 中字段的代码始终引用特定的 class 名称,并且不可能覆盖另一个 class 中的字段,无论是在 Java 中还是在 Kotlin 中。

您可以创建自己的 属性,使用不同的名称,这会将 return 字段的值转换为您需要的类型。