2012-01-30 23 views
22

Jak uzyskać dostęp do scala.None z Java?Dostęp do scala.None z Java

Ostatnia linia powoduje, że kompilator umiera z "scala typu. Brak nie przyjmuje parametrów".

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>(); 

ten nie powiedzie się z "nie można odnaleźć konstruktora symbolu None()":

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

ten nie powiedzie się z "nie można odnaleźć symbol zmienny None":

final Option<String> object2 = None; 

W 2007 to kiedyś pracować, ale potem Scala się zmieniła. Kompilator Java daje error: incompatible types:

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

Przy okazji ... 'scala.None $ .MODULE $' powinien nadal pracować . Jaki miałeś z tym problem? –

+0

możliwy duplikat [Jak używać scala.None z kodu Java] (http://stackoverflow.com/questions/1997433/how-to-use-scala-none-from-java-code) –

Odpowiedz

30

Może to działa:

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

def zastosowanie [A] (x: A): Opcja [A]
fabryce opcja, która tworzy Some (x) jeśli argument nie jest pusty i Brak, jeśli jest pusty.

+0

Brzydki, ale skuteczny –

+5

tak jak java: brzydki, ale skuteczny –

+0

Jaka jest twoja wersja Scala? W Scali 2.11 to nie działa. –

0

można wykonać następujące czynności (testowałem go i działa dobrze dla mnie z Scala 2.9.1 i 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

Nie widziałem odpowiedzi @ om-nom-nom, kiedy to pisałem, ale myślę, że powinno to również zadziałać. – vladmore

+1

'Some (null)' is 'Some (null)', a nie 'None'. –

+0

Tego się spodziewałem, ponieważ miałoby to sens i tak się dzieje, gdy próbuję to zrobić za pomocą interpretera Scala. Ale kiedy próbuję kodu, który napisałem powyżej w pliku java i uruchomię, otrzymuję obiekt obj2.getClass(), który daje mi None $. Nie jestem pewien, dlaczego. – vladmore

9

aby nie umieszczać zbyt dobrze na niej punkt, ale nie należy polegać na statycznych forwarderach, ponieważ w pewnych okolicznościach mogą one nie zostać wygenerowane. Na przykład Some nie ma statycznych usług przesyłania dalej dla towarzyszących obiektów.

Obecny sposób dostępu do metod na towarzysza obiektu to:

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

Option$ jest klasą dla towarzysza obiektowego Option. MODULE$ to końcowe publiczne pole statyczne, które zawiera jedyne wystąpienie Option$ (innymi słowy towarzyszące obiektowi).

+0

Doceniam najlepsze punkty! –

14

Korzystanie Scala 2.10.2 (nie wiem w jakiej wersji, kiedy to przyszedł):

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

Korzystanie Scala wersji 2.11.4 jedyną rzeczą, która pracowała w moim przypadku było

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

Aktualizacja: dzień później ...

Option.apply(null); 

bez parametru type działa też, jak powinno. Z jakiegoś powodu nie mogłem przekonać Intellijla do skompilowania kodu przy pierwszej próbie. Musiałem przekazać parametr typu wtórnego.Teraz to kompiluje, tylko nie pytaj

+0

Tak, to wydaje się bolesne. Jakiej wersji Java używasz? –

+0

Oracle JDK 1.8.0_65 – simou

1

Można importować

import scala.compat.java8.OptionConverters; 

, a następnie:

OptionConverters.<YourType>toScala(Optional.empty()) 
Powiązane problemy