如何在 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 字段的值转换为您需要的类型。
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 字段的值转换为您需要的类型。