2011-01-06 2 views
2

Si je crée un objet singleton Main sans classe de compagnon, est-il possible d'obtenir la classe de ce singleton? classOf[Main] donne une erreur: "introuvable: tapez Main".Obtenir la classe pour Main dans Scala

+0

Si vous voulez l'utiliser pour démarrer un programme avec une méthode principale faisant partie d'un objet compagnon pour une classe portant le même nom, cela ne fonctionnera pas. Scala a seulement la manipulation spéciale de la méthode principale pour les objets qui ne sont pas des compagnons, pour une raison quelconque. – Madoc

+0

@Madoc: Je pensais que c'était corrigé en 2.8.0. Dans tous les cas, je crée toujours un objet 'Main' sans compagnon. Il ne contient généralement que la méthode 'main'. – Ralph

Répondre

3

Comme il est une instance d'une classe, vous pouvez utiliser la méthode Main.getClass pour tirer celui-ci hors tension. En arrière-plan, la JVM sait que Main est une instance d'une classe nommée Main$, accessible par des méthodes de réflexion Java si nécessaire. Ayant dit tout cela, il y a généralement très peu de besoin de réflexion dans Scala, donc vous ne devriez pas en avoir vraiment besoin, sauf si vous êtes juste après un peu de théorie intéressante.

+0

Cas d'utilisation: 'val buildNumber = try { new Manifest (nouvelle URL ("jar:" + classOf [principal] .getProtectionDomain.getCodeSource.getLocation + "! /META-INF/MANIFEST.MF"). openStream) .getMainAttributes.getValue ("Build-Number")} catch {case _: ZipException => "0"} ' – Ralph

+0

Merci. Votre solution a fonctionné. – Ralph

0

Les objets singleton, alias modules, n'ont pas de "classe" car vous ne pouvez pas en hériter. Pensez singleton et classe comme des notions opposées.

Ils ont un type bien:

object Main 

def test(a: Main.type): Unit = println("Got: " + a) 

test(Main) 
+0

Quelle est la différence entre "classe" et "type" ici? –

+0

Eh bien, comme je l'ai dit, un module n'est pas une classe en ce sens que vous pouvez en hériter. Donc Main est plutôt une valeur ("instance") qu'une classe. Main.type vous donne le "singleton-type" d'une valeur. Voir http://programming-scala.labs.oreilly.com/ch12.html (paragraphe Singleton Types), aussi http://blogs.sun.com/sundararajan/entry/mis_understaning_scala_s_singleton –

Questions connexes