2012-01-30 14 views
22

Come è possibile accedere a scala.None da Java?Accesso a scala.None da Java

L'ultima riga causa la morte del compilatore con "tipo scala.Non non assume parametri".

import scala.Option; 
import scala.Some; 
import scala.None; 
final Option<String> object1 = new Some<String>("Hi there"); 
final Option<String> object2 = new None<String>(); 

questo non riesce con "non riesce a trovare il simbolo costruttore None()":

final Option<String> object2 = new None(); 

Questo viene a mancare con "non riesce a trovare il simbolo variabile Nessuno":

final Option<String> object2 = None; 

Nel 2007 questo era lavoro, ma poi Scala è cambiato. Il compilatore Java dà error: incompatible types:

final Option<String> object2 = scala.None$.MODULE$; 
+0

A proposito ... 'scala.None $ .MODULE $' dovrebbe ancora funzionare . Che problema hai avuto con questo? –

+0

possibile duplicato di [Come utilizzare scala.None dal codice Java] (http://stackoverflow.com/questions/1997433/how-to-use-scala-none-from-java-code) –

risposta

30

Questo potrebbe funzionare:

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

applicano DEF [A] (x: A): Opzione [A]
Una fabbrica Opzione che crea Alcuni (x) se l'argomento non è nullo, e None se è nullo.

+0

Ugly, ma efficace –

+5

proprio come java: brutto ma efficace –

+0

Qual è la tua versione di Scala? In Scala 2.11, non funziona. –

0

È possibile effettuare le seguenti (ho testato fuori e tutto funziona bene per me con Scala 2.9.1 e Java 1.6):

final Option<String> obj1 = Some.apply(null) // This will give you a None; 
System.out.println(obj1.getClass()); // will print "class scala.None$ 

final Option<String> obj2 = Some.apply("Something"); 
System.out.println(obj2.getClass()); //will print "class scala.Some 
+0

Non ho visto la risposta @ om-nom-nom pubblicata quando ho scritto questo, ma penso che dovrebbe funzionare altrettanto bene. – vladmore

+1

'Some (null)' è 'Some (null)', non 'None'. –

+0

Questo è quello che mi aspettavo, perché avrebbe senso ed è quello che succede quando lo proverò attraverso l'interprete di Scala. Ma quando provo il codice che ho postato sopra in un file java ed eseguo ottengo obj2.getClass() dandomi None $. Non sono sicuro del perché comunque. – vladmore

9

non mettere troppo fine un punto su di essa, ma non si dovrebbe fare affidamento su forwarder statici, in quanto potrebbero non essere generati in determinate circostanze. Ad esempio, Some non ha server di inoltro statici per il suo compagno di oggetti.

Il modo attuale di accedere a metodi su un oggetto è guidata questo:

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

Option$ è la classe per l'guidata oggetto Option. MODULE$ è un campo statico pubblico finale che contiene l'unica istanza di Option$ (in altre parole, l'oggetto companion).

+0

Apprezzo i punti più sottili! –

14

Utilizzando Scala 2.10.2 (non so a quale versione, quando questo è venuto in):

final Option<String> none = Option.empty(); 
0

Utilizzando Scala versione 2.11.4 l'unica cosa che ha funzionato nel mio caso, è stato

Option<String> maybeAmount = (amount != MISSING_STOCKAMOUNT) 
? Some.apply(amount+"") : Option.<String>apply(null); // can you feel the pain?? 

Aggiornamento: il giorno dopo ...

Option.apply(null); 

senza il parametro di tipo funziona troppo, come dovrebbe. Per qualche motivo non sono riuscito a ottenere da Intellij la compilazione del codice al primo tentativo. Ho dovuto passare il parametro di tipo secondario.Ora si compila, basta non chiedere

+0

Sì, sembra doloroso. Quale versione di Java stai usando? –

+0

Oracle JDK 1.8.0_65 – simou

1

È possibile importare

import scala.compat.java8.OptionConverters; 

E poi:

OptionConverters.<YourType>toScala(Optional.empty())