簡體   English   中英

將具有繼承關系的Java bean轉換為Kotlin的問題

[英]Issue converting Java bean with inheritance to Kotlin

在當前的Java類上,我們有2個Java Bean Clazz1和Clazz2,它們都擴展了超類SuperClazz。 我們還有一個列表,在其中我們可以迭代超類條目(可以是Clazz1或Clazz2):

List<SuperClazz> entries;

現在,我們需要將代碼轉換為Kotlin,但是由於數據類不支持繼承,因此我們不確定要解決此問題的最佳方法,我們是否只是創建帶有變量的標准Kotlin類,擴展超類,並手動制作getter -setters? 或者,有沒有更好的方法呢?

通常,有兩種方法可以消除類繼承的需要:

1.使用成分

Clazz1Clazz2之間通用的片段提取到單獨的類中。

data class SharedStuff(val a:Int, val b:String)
data class Class1(val stuff:SharedStuff, val other:String)
data class Class2(val stuff:SharedStuff, val specific:Int)

然后您可以在列表中使用它

class Container {
    private var items = listOf<()->SharedStuff>()
    fun add(a:Class1) { items += { a.stuff } }
    fun add(b:Class2) { items += { b.stuff } }
}

2.使用界面

從上面的示例可以很容易地看出,您可以提取一個接口來表示Class1Class2內部的通用接口,如下所示:

interface HasStuff { val stuff:SharedStuff }

data class SharedStuff(val a:Int, val b:String)
data class Class1(override val stuff:SharedStuff, val other:String) : HasStuff
data class Class2(override val stuff:SharedStuff, val specific:Int) : HasStuff

class Container {
    private var items = listOf<HasStuff>()
    fun add(a:HasStuff) { items += a }
}

請注意,我們不一定需要將SharedStuff作為類。 您還可以在共享界面上擁有更多成員,並且仍然可以通過Kotlin的委派來簡化工作。 (不過,通常最好使用“小”接口

我們決定這樣做:

   interface HasStuff { val sharedDt:Int }
   data class Class1(override val sharedDt:Int, val other:String) : HasStuff
   data class Class2(override val sharedDt:Int, val specific:Int) : HasStuff

   class Container {
       private var items = listOf<HasStuff>()
       fun add(a:HasStuff) { items += a }
   }

我們是否只是使用變量創建了標准的Kotlin類,擴展了超類並手工制作了吸氣劑?

是的,雖然不是帶有變量,但是帶有屬性 如果您的SuperClazz沒有任何字段,則可以將其轉換為接口,並且數據類可以實現接口-盡管您仍然必須實現方法,但這將使您能夠使用相同的體系結構(迭代超類型參數集合)。 沒有按照您描述的方式使用數據類自動屬性的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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