Maison  >  Article  >  Utilisation des méthodes Kotlin avec des classes de valeurs dans la signature de code Java

Utilisation des méthodes Kotlin avec des classes de valeurs dans la signature de code Java

WBOY
WBOYavant
2024-02-09 08:51:22579parcourir

L'utilisation de méthodes Kotlin avec des classes de valeurs dans la signature de code Java est une technique de développement courante. Les classes de valeurs sont un type spécial dans Kotlin qui peut être utilisé pour stocker et transmettre des données, similaire aux types de données de base en Java. En utilisant les méthodes Kotlin avec des classes de valeurs dans le code Java, nous pouvons tirer pleinement parti du sucre syntaxique et des fonctionnalités de programmation fonctionnelle de Kotlin pour gérer les données de manière concise et élégante. Dans cet article, nous présenterons comment utiliser les méthodes Kotlin avec des classes de valeurs dans le code Java et explorerons leurs avantages et considérations. Que vous soyez développeur Java ou passionné de Kotlin, cet article vous apportera de précieuses connaissances et conseils.

Contenu de la question

J'ai une entité Kotlin comme celle-ci

value class entityid(val id: long) {}

Et quelques interfaces de service

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

et sa mise en œuvre.

Mais quand j'utilise l'interface du code java comme ci-dessous

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

Je reçois des erreurs de compilation. Mais c'est un comportement très compréhensible puisque le compilateur kotlin génère fun do(entityid: long) à partir du code source. D'accord, utilisons quelque chose comme service.do(1l). Une autre question va se poser :

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

Je suppose que c'est parce que l'interface ne change pas réellement lors de la compilation. J'ai trouvé un moyen - ajoutez value class 替换为 data class 但我会有 value class.

Peut-être existe-t-il une solution à cette situation ?

Solution de contournement

Vous pouvez utiliser la surcharge long 的函数重载采用 value 类 的函数,并在后台调用原始函数。注意 @jvmname 上的 value 类 重载,这样 java 只会看到 long.

Kotlin

@jvminline
value class entityid(val id: long)

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

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

Vous pouvez ensuite l'appeler depuis Java en utilisant le long littéral :

service.process(42L);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer