java scala singleton scala-java-interop maybe

Accediendo a scala.None desde Java



singleton scala-java-interop (6)

¿Cómo se puede acceder a scala.None desde Java?

La última línea hace que el compilador muera con "tipo scala.None no toma parámetros".

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

Esto falla con "no se puede encontrar el constructor del símbolo Ninguno ()":

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

Esto falla con "no se puede encontrar la variable de símbolo Ninguna":

final Option<String> object2 = None;

En 2007 esto solía funcionar, pero luego Scala cambió. El compilador de Java da error: incompatible types :

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


Esto podría funcionar:

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

def aplique [A] (x: A): Opción [A]
Una fábrica de opciones que crea Some (x) si el argumento no es nulo, y None si es nulo.


No es necesario ponerle un punto demasiado fino, pero uno no debe confiar en los reenviadores estáticos, ya que podrían no generarse en ciertas circunstancias. Por ejemplo, Some no tienen reenviadores estáticos para su compañero de objeto.

La forma actual de acceder a los métodos en un objeto compañero es esta:

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

Option$ es la clase para el objeto compañero de Option . MODULE$ es un campo estático público final que contiene la única instancia de Option$ (en otras palabras, el objeto compañero).


Puedes hacer lo siguiente (lo probé y me funciona bien con Scala 2.9.1 y 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


Puedes importar

import scala.compat.java8.OptionConverters;

Y entonces:

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


Usando Scala 2.10.2 (no estoy seguro de en qué versión cuando llegó esto):

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


Utilizando la versión 2.11.4 de Scala, lo único que funcionó en mi caso fue

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

Actualización: un día después ...

Option.apply(null);

sin el tipo de parámetro funciona también, como debería. Por alguna razón, no pude hacer que Intellij compile el código en mi primer intento. Tuve que pasar el parámetro de tipo secundario. Ahora compila, simplemente no preguntes.