La classe Java qui étend la classe de base Kotlin ne peut pas appeler les méthodes internes de base

James Busby:

J'expérimente avec Kotlin sur Android, avec Android Studio, en le mélangeant avec du code Java existant, et j'ai rencontré un problème.

J'ai une classe de base dans Kotlin avec une seule méthode marquée comme internal:

package com.example.kotlin.hellokotlin

open class KotlinBaseClass
{
    internal fun doSomething()
    {
        println("Done something!")
    }
}

Je crée ensuite une classe Kotlin qui s'étend KotlinBaseClasset appelle la méthode de classe de base:

package com.example.kotlin.hellokotlin

class KotlinDerivedClass : BaseClass()
{
    fun doSomethingElse()
    {
        doSomething()
        println("Done something else!")
    }
}

Cela compile et fonctionne très bien.

Si je crée maintenant une classe Java qui s'étend à la KotlinBaseClassplace, destinée à être fonctionnellement identique à KotlinDerivedClass:

package com.example.kotlin.hellokotlin;

public class JavaDerivedClass extends KotlinBaseClass
{
    public void doSomethingElse()
    {
        doSomething();
        System.out.println("Done something else!");
    }
}

Je trouve que cette classe ne se compilera pas, car la méthode doSomething()ne peut pas être résolue. Si je supprime le internalmot - clé de la déclaration de doSomething()in KotlinBaseClass, tout fonctionne. Toutes les classes sont définies dans le même package.

Est-ce un comportement attendu? Un problème connu d'interopérabilité entre Java et Kotlin?

leonardkraemer:

La chose avec le nom est expliquée ici dans https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

les déclarations internes deviennent publiques en Java. Les membres des classes internes subissent une modification des noms, pour rendre plus difficile leur utilisation accidentelle depuis Java et pour permettre la surcharge pour les membres avec la même signature qui ne se voient pas selon les règles de Kotlin;

Dans votre classe Java, vous devriez être en mesure de trouver le nom en tapant les premiers caractères, puis alt + spaced'obtenir l'auto-complétion. Le nom complet de la fonction dans votre classe Java estdoSomething$nameOfYourModule

Vous pouvez également définir doSomethingà protectedet accéder par son nom normal.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive