Maison > Java > 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
Libérer: 2024-02-09 08:51:22
avant
633 Les gens l'ont consulté

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) {}
Copier après la connexion

Et quelques interfaces de service

interface service() {
    fun do(entityid: entityid)
}
Copier après la connexion

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 
}
Copier après la connexion

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)
Copier après la connexion

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))
    }
}
Copier après la connexion

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

service.process(42L);
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal