簡體   English   中英

如何在 kotlin 中覆蓋 Java 類屬性變量

[英]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 互操作中的一個問題。

這是一個克服它的黑客:

  1. 創建一個輔助 Java 類,隱藏有問題的protected字段:
public class myBaseClassKtInterop extends myBaseClass {
    private String myVar;
}
  1. 在 kotlin 中擴展它; 還可以考慮為方法添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM