2016-01-04 3 views
2

Предположим, у меня естьМожете ли вы предоставить границы обзора Scala от Java?

val a: Option[String] = None 
someJavaFunction(a) 

А затем в файле Java, я хочу сделать что-то вроде этого:

public someJavaFunction(Option<String> o) { 
    o.orNull(); 
} 

Подпись orNull, однако, заключается в следующем:

orNull [A1 >: A](implicit ev : <:<[Null, A1]) : A1 

Итак, с Java, мне нужно будет предоставить эту функцию доказательств, которая, как правило, подмахивается Scala (от я не знаю, где). Как я могу получить значение доказательств, чтобы пройти здесь?

Это явно неразумно.

Возможно ли это?

+2

http://stackoverflow.com/questions/7808821/java-calling-scala-case-class-w-implicit-parameter – user3707125

+0

Возможно, возможно просто передать «null», но это не выглядит очень чистым , 'O.orNull (нуль)'. – Clashsoft

+0

@ user3707125 Спасибо за указатель. Я знаю, как передать параметр - вопрос в том, что мне передать? – MHarris

ответ

2

Класс <:< определяется в scala.Predef и обычно это scala.Predef.conforms(), что дает вам пример в Scala. Таким образом, вы могли бы сделать что-то вроде

public class Foo { 
    public static String foo(scala.Option<String> o) { 
    return o.orNull(
     (scala.Predef.$less$colon$less< scala.runtime.Null$ , String >) 
     (Object)scala.Predef.conforms() 
    ); 
    } 
} 

, который дает предупреждение о непроверенной операции, но работает.

Вы также можете создать экземпляр scala.Predef.$less$colon$less, который делает правильную вещь (просто возвращает свой аргумент), и там трансляция проходит без предупреждения.

Примечание: вы должны оставить пробел после Null$ или javac запутался.

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