Comment appelez-vous un Scala singleton méthode de Java?
Je suis en train d'injecter une dose d'Scala code dans mon application Java. (Donc, en étant dit, je veux un peu plus de plaisir).
- Je créer un singleton trucs en Scala
ScalaPower.scala
package org.fun
class ScalaPower
object ScalaPower{
def showMyPower(time:Int) = {
(0 to time-1).mkString(", ")
}
}
Maintenant, à l'intérieur OldJava.java
class OldJava {
public void demo(){
System.out.println(?)
}
}
Que dois-je remplir ?
de sorte que Java va appeler la showMyPower méthode?
J'ai essayé les deux org.fun.ScalaPower.showMyPower(10)
et org.fun.ScalaPower.getInstance().showMyPower(10)
mais aucun travail.
(Décompiler le fichier de classe à l'aide de Jad me montrer, mais rien de non-sens du code.)
Modifier
- Je supprimer le class ScalaPower
déclaration et à la scala de produire de la méthode statique comme prévu. (appel à org.fun.ScalaPower.showMyPower(10)
fonctionne, tout simplement).
Me demande si c'est un bug dans le compilateur scala ou pas
- Qu'en est
org.fun.ScalaPower.showMyPower(10)
? - Aïe, mon mauvais. Oublié de changer l'espace de noms. Mise à jour de la question déjà. Merci.
- Par ailleurs, vous pouvez écrire
0 until time
au lieu de0 to time-1
.
Vous devez vous connecter pour publier un commentaire.
Je pense que ce indirectement, il couvre:
Comme on la trouve ici: http://programming-scala.labs.oreilly.com/ch06.html
En bref parce que votre Objet est un compagnon de l'objet (a un compagnon de classe) vous ne pouvez pas l'appeler comme vous vous attendez. Comme vous l'avez constaté si vous vous débarrasser de la classe à laquelle il va travailler.
Il est généralement préférable d'accès le singleton directement à partir de sa propre classe.
Dans ce cas:
Sans rentrer trop dans les détails d'implémentation, Scala différencie les espaces de noms entre l'Objet et de Classe/Trait. Cela signifie qu'ils peuvent utiliser le même nom. Toutefois, un objet a une classe, et donc besoin d'une déformation du nom de la JVM. L'actuel Scala conventions est d'ajouter un $ à la fin du nom du module (pour le haut-niveau de modules). Si l'objet est défini dans une classe, je crois que la convention est OuterClass$ModuleName$. Pour appliquer le singleton propriété de la ScalaPower module, il y a aussi un MODULE statique$ membre de l'ModuleName de classe$. C'est initialisée à la classe de charge, tout en assurant qu'il n'existe qu'une seule instance. Un effet secondaire de ceci est que vous devez pas faire toute sorte de verrouillage dans un constructeur du module.
Dans tous les cas, Scala a également intégré dans une "rendre les choses plus agréable pour Java" statique-transitaires mécanisme. C'est là qu'il écrit des méthodes statiques de la ScalaPower classe qui viens de l'appeler ScalaPower$.MODULE$.someMethod(). Si vous définissez également un compagnon de classe, les porteurs pourraient être générés sont limitées, comme vous n'êtes pas autorisé à avoir des conflits de noms avec statique d'instance et des méthodes de niveau de la JVM. Je pense que dans 2.8.0 cela signifie que si vous avez un compagnon de l'objet, vous perdez votre statique transitaires.
Dans ce cas une "meilleure pratique" serait de toujours utiliser la ScalaPower$.MODULE$ de référence au lieu d'une statique transitaire, en tant que transitaire pourraient disparaître avec les modifications apportées à la ScalaPower classe.
EDIT: Faute de frappe
Quelles étaient les erreurs que vous aviez?
À l'aide de votre Scala échantillon et suivants de la classe Java:
cat test.java
:Et en cours d'exécution comme suit:
java -cp .:<path-to/scala/install-dir>/lib/scala-library.jar test
donne ma sortie:
show my power: 0, 1, 2
"Symbol 'showMyPower' not found"
(bien que l'IDÉE Scala Plugin comprendre, et de m'offrir une auto-complétion)showMyPower
est déclarée à l'intérieur d'Scala$, pas de Scala. La version de Scala vous utilisez ces code compilable? Je suis en utilisant 2.7.5org.fun.ScalaPower$.MODULE$.showMyPower
est en effet la bonne méthode, je devrais l'appeler, Ce que le diable?class ScalaPower
déclaration avant leobject ScalaPower
et il a compilé comme vous parlais.Garder à l'esprit que le stock
javap
outil peut être utilisé pour voir ce que le compilateur Scala produit. Il ne veut pas répondre directement à votre question, bien sûr, mais quand ce que vous avez besoin est juste de se rappeler que le code de génération de modèles, c'est suffisant.Après avoir fait
ScalaPower.showMyPower(10)
fonctionne comme prévu.