![](/img/trans.png)
[英]How to override a method of another class instance in Java/Kotlin?
[英]How to override a java class property variable in kotlin
我試圖在我的 kotlin 類中覆蓋一個 java 屬性變量,但不斷收到錯誤“myVar 沒有覆蓋任何內容”。 如何覆蓋 kotlin 類的示例在這里,但它沒有說明關於覆蓋 java 屬性的任何內容。 這是代碼:
//Java
public class myBaseClass{
protected String myVar = "hello";
public myBaseClass(){
}
protected void myOneMethod(){
System.out.println(myVar);
}
}
//Kotlin
class myChildClass() : myBaseClass() {
override var myVar = "hi"
override fun myOneMethod()
{
System.out.println(myVar)
}
}
由於 Java 沒有屬性,您需要將該字段設為私有並提供 getter 和 setter。 然后在 Kotlin 中,您可以覆蓋 getter 和 setter。 這並不漂亮,但這也是您必須在 Java 子類中執行的方式。 您需要另一個私有屬性來為您的子類實現創建新的支持字段。
public class MyBaseClass {
private String myVar = "hello";
public MyBaseClass(){
}
protected String getMyVar() {
return myVar;
}
protected void setMyVar(String myVar) {
this.myVar = myVar;
}
protected void myOneMethod(){
System.out.println(getMyVar());
}
}
class MyChildClass : MyBaseClass() {
private var overriddenMyVar: String? = "hi"
override fun getMyVar(): String? {
return overriddenMyVar
}
override fun setMyVar(myVar: String?) {
overriddenMyVar = myVar
}
}
fun main() {
val x : MyBaseClass = MyChildClass()
x.myOneMethod() // Prints "hi"
}
Java 中的字段不能以任何方式被覆蓋。 由於myVar
在 Java 中是一個字段,因此在 Kotlin 中不能被覆蓋。
像這樣嘗試:
//Kotlin
class KotlinImplementation: MyBaseClass() {
init {
myVar = "ji"
}
}
//Java
public class MyBaseClass {
protected String myVar = "hello";
public MyBaseClass(){
}
protected void myOneMethod(){
System.out.println(myVar);
}
}
看起來像是 Java 互操作中的一個問題。
這是一個克服它的黑客:
protected
字段:public class myBaseClassKtInterop extends myBaseClass {
private String myVar;
}
public
修飾符,覆蓋protected
修飾符(如果你不這樣做,方法將保持protected
;在這種情況下,默認的公共可見性不起作用):class myChildClass : myBaseClassKtInterop() {
var myVar = " hi"
public override fun myOneMethod() {
println(myVar)
}
}
現在訪問myVar
兩種方法都可以使用:
myChildClass().myOneMethod() //hi
println(myChildClass().myVar) //hi
另請注意,如果有其他方法訪問myBaseClass
myVar
,它們將使用"hello"
值。 也考慮覆蓋所有這些,或者直接在myBaseClass
myVar
可見性更改為private
(如果可能),在這種情況下,您將不需要這個輔助類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.