В Scala, как я могу передать значение null в метод Java, который ожидает Long? - PullRequest
1 голос
/ 06 октября 2010

У меня есть метод Java, который принимает значение Long:

(in Java)
public void setValue(Long value);

Я понимаю, что ноль Scala не расширяет ни один из типов значений, включая Long.Поэтому, когда я пытаюсь передать ему значение null, я получаю ошибку компиляции:

(in Scala)
javaThing.setValue(null)

==> type mismatch; found  : Any required: java.lang.Long

РЕДАКТИРОВАТЬ: aargh!Игнорировать над фрагментом.Я упростил проблему и попал в беду.На самом деле проблема возникает из-за моего использования Option [Long] следующим образом:

javaThing.setValue(calcValue.getOrElse(null))

Я думаю, проблема в том, что getOrElse вычисляет тип Any, когда ему присваивается нулевой аргумент.1012 *

Помогите!

Ответы [ 5 ]

10 голосов
/ 06 октября 2010

Явное приведение с использованием asInstanceOf будет работать:

scala> val l:java.lang.Long = Some(2L).getOrElse(null).asInstanceOf[java.lang.Long]
l: java.lang.Long = 2

scala> val n:java.lang.Long = None.getOrElse(null).asInstanceOf[java.lang.Long]    
n: java.lang.Long = null

Итак, что-то вроде этого должно работать:

javaThing.setValue(calcValue.getOrElse(null).asInstanceOf[java.lang.Long])

Это подрывает систему типов, но также использует null на первом месте.

7 голосов
/ 20 ноября 2014

Или даже короче:

null.asInstanceOf[Long]
5 голосов
/ 06 октября 2010

Я не могу воспроизвести это здесь.

JavaTst.java:

public class JavaTst {
    public void setValue(Long value) {}
}

РЕПЛ:

scala> new JavaTst
res0: JavaTst = JavaTst@4e229e

scala> res0.setValue(null)

scala>

EDIT

Aha! В этом случае этот замысловатый код будет работать:

res0.setValue(calcValue.map(new java.lang.Long(_)).getOrElse(null))

Я предлагаю импортировать java.lang.Long в jlLong, чтобы он был короче.

0 голосов
/ 25 июля 2018

use .orNull:

javaThing.setValue (calcValue.orNull)

0 голосов
/ 06 октября 2010

Насколько я помню, нет другого выхода, кроме выбора значения long для работы как ноль.Обычно это -1, который используется.

...