How to use scala.None from Java code [duplicate]

2019-01-23 22:51发布

Possible Duplicate:
Accessing scala.None from Java

In Java you can create an instance of Some using the constructor, i.e. new Some(value), but None has no partner class. How do you pass None to a Scala function from Java?

5条回答
女痞
2楼-- · 2019-01-23 23:04

You can access the singleton None instance from java using:

scala.None$.MODULE$
查看更多
乱世女痞
3楼-- · 2019-01-23 23:10

The scala.None$.MODULE$ thing doesn't always typecheck, for example this doesn't compile:

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

because javac doesn't know about Scala's declaration-site variance, so you get:

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

This does compile, though:

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

so that's a different way to get a None that is usable in more situations.

查看更多
姐就是有狂的资本
4楼-- · 2019-01-23 23:10

I've found this this generic function to be the most robust. You need to supply the type parameter, but the cast only appears once, which is nice. Some of the other solutions will not work in various scenarios, as your Java compiler may inform you.

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();
    }
}
查看更多
爱情/是我丢掉的垃圾
5楼-- · 2019-01-23 23:17

I think this ugly bit will work: scala.None$.MODULE$

There is no need for a new instance since one None is as good as another...

查看更多
Lonely孤独者°
6楼-- · 2019-01-23 23:22

Faced with this stinkfest, my usual modus operandi is:

Scala:

object SomeScalaObject {
  def it = this
}

Java:

doStuff(SomeScalaObject.it());
查看更多
登录 后发表回答