Rumah  >  Artikel  >  Menggunakan kaedah kotlin dengan kelas nilai dalam tandatangan kod Java

Menggunakan kaedah kotlin dengan kelas nilai dalam tandatangan kod Java

WBOY
WBOYke hadapan
2024-02-09 08:51:22619semak imbas

Menggunakan kaedah Kotlin dengan kelas nilai dalam tandatangan kod Java ialah teknik pembangunan yang biasa. Kelas nilai ialah jenis khas dalam Kotlin yang boleh digunakan untuk menyimpan dan menghantar data, serupa dengan jenis data asas dalam Java. Dengan menggunakan kaedah Kotlin dengan kelas nilai dalam kod Java, kami boleh memanfaatkan sepenuhnya gula sintaksis Kotlin dan ciri pengaturcaraan berfungsi untuk mengendalikan data dengan cara yang ringkas dan elegan. Dalam artikel ini, kami akan memperkenalkan cara menggunakan kaedah Kotlin dengan kelas nilai dalam kod Java dan meneroka kelebihan dan pertimbangannya. Sama ada anda seorang pembangun Java atau peminat Kotlin, artikel ini akan membawa anda pengetahuan dan petua yang berharga.

Kandungan soalan

Saya ada entiti kotlin seperti ini

value class entityid(val id: long) {}

Dan beberapa antara muka perkhidmatan

interface service() {
    fun do(entityid: entityid)
}

dan pelaksanaannya.

Tetapi apabila saya menggunakan antara muka daripada java kod seperti di bawah

{
    ...
    entityid id = new entityid(1l);
    service.do(id) // service is interface here 
}

Saya mendapat ralat kompilasi. Tetapi ini adalah tingkah laku yang sangat difahami kerana pengkompil kotlin menjana fun do(entityid: long) daripada kod sumber. Okay, mari kita gunakan sesuatu seperti service.do(1l). Soalan lain akan timbul:

java: cannot find symbol
symbol:   method do(long)

Saya rasa ini kerana antara muka sebenarnya tidak berubah semasa penyusunan. Saya jumpa jalan - tambah value class 替换为 data class 但我会有 value class.

Mungkin, adakah terdapat penyelesaian untuk situasi ini?

Penyelesaian

Anda boleh menggunakan long 的函数重载采用 value 类 的函数,并在后台调用原始函数。注意 @jvmname 上的 value 类 重载,这样 java 只会看到 long lebihan.

Kotlin

@jvminline
value class entityid(val id: long)

class service {
    @jvmname("processentity")
    fun process(entityid: entityid) {        
    }

    fun process(entityid: long) {
        process(entityid(entityid))
    }
}

Anda kemudian boleh memanggilnya dari java menggunakan long literal:

service.process(42L);

Atas ialah kandungan terperinci Menggunakan kaedah kotlin dengan kelas nilai dalam tandatangan kod Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam