6
votes

Kotlin pour les classes intérieures finales Android et statique

J'essaie de réécrire mon application Android sur Kotlin et que j'ai rencontré un problème lors de la conversion de la classe contractuelle de contenu. J'ai donc une classe de contrat simple (des trucs par défaut comme le type de contenu et les URIS de contenu sont omis):

object BirthdayContract {
    class Contacts : BaseColumns {
        companion object {
            val NAME = "Name"
            val BIRTH = "Birth"
            val IMAGE = "Image"
        }
    }
}


2 commentaires

Veuillez fournir un MCVE . J'ai collé votre anniversaire dans un nouveau fichier kotlin, supprimé `: basecolumns` tel qu'il ne compile pas avec elle et crée une fonction qui accède à anniversairetract.contacts.name . Je crois que vous devez fournir plus d'informations et / ou d'exemples mis à jour qui compilent et démontrent le problème que vous voyez. Merci.


@ mfulton26 J'ai fait la même chose - créé un nouveau fichier .kt et copié mon code de kotlin à l'intérieur. Il compile sans erreurs. Il n'y avait aucun problème avec l'interface Basecolumns. Quel genre d'erreur avez-vous?


4 Réponses :


6
votes

nom est une propriété et par défaut, son champ de support contient un accès privé. Mais comme c'est une propriété, il y a un getter pour cela: getname () .

Comme ce n'est pas ainsi que vous accédez naturellement aux constantes de Java, il existe quelques façons d'exposer directement le champ:

  1. const : < Code> const val name = "nom"
  2. @jvmfield < / a> Annotation: @jvmfield val name = "nom"

1 commentaires

@Jvmfield fonctionne bien pour moi, merci! Cependant, "const" et "@jvmstatic" n'affectent rien.



0
votes

envisagez d'utiliser un objet clair fort> comme cela.:

object Contract {
    object Contacts {
        val NAME = "Name"
        val BIRTH = "Birth"
        val IMAGE = "Image"
    }
}


0 commentaires

0
votes

Vous pouvez le faire avec un @jvmstatic

object BirthdayContract {
    object Contacts  {
           const val NAME = "Name"
           const val BIRTH = "Birth"
           const val IMAGE = "Image"

    }
}
//Java
BirthdayContract.Contacts.NAME


1 commentaires

Basecolumns ont une pièce d'identité et comptent, je pense que c'est la raison pour laquelle Noktigula l'étends.



2
votes

Pour exposer les constantes comme champs, annotant-les avec @jvmfield code> xxx pré>

alors vous pouvez les utiliser à partir de Java comme ceci: p>

String name = Contacts.NAME;


0 commentaires