2010-01-04 20 views

Répondre

19

Je pense que ce bit laid fonctionne: scala.None$.MODULE$

Il n'y a pas besoin d'une nouvelle instance puisque l'un est Aucun aussi bon qu'un autre ...

10

Vous pouvez accéder à la singleton Aucun exemple de Java en utilisant :

scala.None$.MODULE$ 
49

La chose scala.None$.MODULE$ ne typecheck pas toujours, par exemple, cela ne compile pas:

scala.Option<String> x = scala.None$.MODULE$; 

parce que javac ne connaît pas la variance déclaration de site de Scala, vous obtenez:

J.java:3: incompatible types 
found : scala.None$ 
required: scala.Option<java.lang.String> 
    scala.Option<String> x = scala.None$.MODULE$ ; 

Cela ne compile, si:

scala.Option<String> x = scala.Option.apply(null); 

donc qui est une autre façon d'obtenir un Aucun que est utilisable dans plus de situations.

+8

J'ai même dû écrire "scala.Option.apply ((String) null)" pour rendre le compilateur heureux. – Eric

+1

Merci! Cela a fonctionné pour moi, tandis que scala.None $ .MODULE $ produit des erreurs de type. –

1

Face à cette stinkfest, mon modus operandi habituel est:

Scala:

object SomeScalaObject { 
    def it = this 
} 

Java:

doStuff(SomeScalaObject.it()); 
2

J'ai trouvé cette cette fonction générique pour être le plus robuste . Vous devez fournir le paramètre type, mais la distribution n'apparaît qu'une seule fois, ce qui est bien. Certaines des autres solutions ne fonctionneront pas dans divers scénarios, car votre compilateur Java peut vous informer.

import scala.None$; 
import scala.Option; 

public class ScalaLang { 

    public static <T> Option<T> none() { 
     return (Option<T>) None$.MODULE$; 
    } 
} 

public class ExampleUsage { 
    static { 
     //for example, with java.lang.Long 
     ScalaLang.<Long>none(); 
    } 
}