J'ai ici une bibliothèque avec des classes Java. Une classe a quelques méthodes protected static
, que je réalise est en quelque sorte un OOP non-non mais je ne peux pas changer son code. En supposant que j'ai une classe Scala qui sous-classe la classe Java mentionnée ci-dessus, comment puis-je appeler ses membres statiques protégés?Appel d'une méthode Java statique protégée à partir de Scala
Répondre
Voir Frequently Asked Questions - Java Interoperability:
C'est une limitation connue de Scala: il n'y a pas de notion de membres 'statiques' à Scala. Au lieu de cela, Scala traite membres statiques de la classe Y comme membres de l'objet singleton Y (l'objet compagnon de la classe Y). Lorsque héritant de cette classe, on peut accès qu'aux membres protégés de la classe Y, mais ne peuvent pas accéder aux membres protégés de Y. objet
Il n'y a aucun moyen Scala peut simuler statique protégé sans porter atteinte à l'intégrité du modèle objet de Scala d'une façon fondamentale, donc cela ne va pas pour changer. Pour contourner cette limitation , il faut créer une implémentation de la classe englobante avec du code Java qui encapsule tous les accès à la classe statique interne protégée.
Voir ticket #1806 pour plus d'informations et un exemple concret de la limitation et sa solution.
Les questions fréquemment posées sont si rarement posées que peu de gens remarquent son existence. :-) –
Haha, en effet :) –
JFYI, cela est corrigé dans 2.10.0-M2 – OlegYch
N'est-ce pas une option de créer une sous-classe Java qui appelle la méthode super classe? Vous pouvez ensuite rendre votre classe Java accessible à Scala. – Madoc
Ah, oui, je suppose que je pourrais suivre cette route. Merci. Cela semble un peu étrange que ce n'est pas possible directement! –
Peut-être que c'est plus directement possible à Scala, je ne sais pas. C'est pourquoi j'ai posté ceci comme commentaire et non comme réponse. Évidemment, un appel "super" ne peut pas fonctionner car Scala n'a pas d'héritage statique. Peut-être que vous pouvez créer un objet Scala qui étend la classe en question et ensuite appeler "LibraryClassName.staticMethodName (...)", évitant ainsi d'utiliser "super"? Je ne suis pas sûr que cela fonctionnerait. – Madoc