2010-01-04 1 views

ответ

19

Я думаю, что это некрасиво бит будет работать: scala.None$.MODULE$

Там нет необходимости в новом экземпляре, так как один Никто не так хорошо, как другие ...

10

Вы можете получить доступ к одноплодной None экземпляра из Java с помощью :

scala.None$.MODULE$ 
49

scala.None$.MODULE$ вещь не всегда typecheck, например, это не компилируется:

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

потому что Javac не знает о дисперсии декларации-сайта Scala, так что вы получите:

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

Это компилировать, хотя:

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

так, что другой способ, чтобы получить None, что может использоваться в других ситуациях.

+8

Мне даже пришлось написать «scala.Option.apply ((String) null)», чтобы сделать компилятор счастливым. – Eric

+1

Спасибо! Это сработало для меня, в то время как scala.None $ .MODULE $ произвел ошибки типа. –

1

Столкнувшись с этим stinkfest, мой обычный принцип работы:

Scala:

object SomeScalaObject { 
    def it = this 
} 

Java:

doStuff(SomeScalaObject.it()); 
2

Я нашел эту обобщенную функцию, чтобы быть самым надежным , Вам нужно указать параметр типа, но листинг появляется только один раз, что приятно. Некоторые из других решений не будут работать в различных сценариях, как может сообщить ваш компилятор Java.

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

 Смежные вопросы

  • Нет связанных вопросов^_^