Accessing scala.None from Java

2019-01-12 08:30发布

How can you access scala.None from Java?

The last line causes the compiler to die with "type scala.None does not take parameters".

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

This fails with "cannot find symbol constructor None()":

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

This fails with "cannot find symbol variable None":

final Option<String> object2 = None;

In 2007 this used to work, but then Scala changed. The Java compiler gives error: incompatible types:

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

6条回答
啃猪蹄的小仙女
2楼-- · 2019-01-12 08:57

Using Scala 2.10.2 (not sure at what version when this came in):

final Option<String> none = Option.empty();
查看更多
Viruses.
3楼-- · 2019-01-12 09:01

You can import

import scala.compat.java8.OptionConverters;

And then:

OptionConverters.<YourType>toScala(Optional.empty())
查看更多
够拽才男人
4楼-- · 2019-01-12 09:02

Using Scala version 2.11.4 the only thing that worked out in my case, was

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

Update: a day later...

Option.apply(null);

without the type parameter does work too, as it should. For some reason I couldn't get Intellij to compile the code on my first attempt. I had to pass the secondary type parameter. Now it compiles, just don't ask

查看更多
再贱就再见
5楼-- · 2019-01-12 09:05

Not to put too fine a point on it, but one shouldn't rely on static forwarders, as they might not get generated under certain circumstances. For instance, Some doesn't have static forwarders for its object companion.

The current way of accessing methods on an object companion is this:

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

Option$ is the class for the object companion of Option. MODULE$ is a final public static field that contains the sole instance of Option$ (in other words, the object companion).

查看更多
Root(大扎)
6楼-- · 2019-01-12 09:13

This might work:

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

def apply [A] (x: A): Option[A]
An Option factory which creates Some(x) if the argument is not null, and None if it is null.

查看更多
一夜七次
7楼-- · 2019-01-12 09:18

You can do the following (I tested it out and it works fine for me with Scala 2.9.1 and 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
查看更多
登录 后发表回答