2016-11-15 3 views
2

Я разумный новый для scala и совместной работы с scala и Java.Как преобразовать scala Int в java Integer?

Я пытаюсь передать scala Int в метод, который принимает Integer (java.long.Integer). Поскольку они имеют разные типы, компилятор дает ошибку.

/* name- Option[String], id- Option[Integer] , mask- Option[String]*/ 
new findingFrame(name,id, mask) 

case class findingFrame(name: String, 
         id: Option[java.lang.Integer], 
         mask : Option[String]) 

Я попытался с помощью .instanceOf [java.lang.Integer], но это не работает, либо ..

Я не знаю, как решить эту проблему .. Может кто-нибудь помочь мне, пожалуйста? Спасибо.

+0

Строки кода, которые вы отправили, путают. Что такое метод Java? Какая строка кода точно дает вам ошибку? Каково точное сообщение об ошибке? Что класс дела имеет к этому отношение? Он принимает «Option [Integer]» (странная смесь Scala «Option» и Java Integer). – Jesper

+0

Класс case принимает 'Option [Integer]', а не 'Integer'. «Параметр» не является «Целом», поэтому вы не можете отбрасывать один на другой. – Jesper

ответ

1

Я думаю, что большинство других ответов охватывают его, ваша проблема связана с использованием Option, а не с разницей между scala и целыми целями java.Там же много вещей, которые вы можете сделать с опциями, например: Дано:

val optionOfInteger = Option(5) 
  • (некрасиво) предположим, что ваш вариант всегда имеет значение, просто используйте получить (val i = optionOfInteger.get)
  • Применить значение по умолчанию: (val i = optionOfInteger.getOrElse(0))
  • Вы можете отобразить вариант целого числа в опции чего-то другого (val optionOfString = optionOfInteger.map(_.toString))
  • Вы можете сделать оба из двух последних в одном вызове (val str = optionOfInteger.fold("Nothing")(_.toString))
  • Вы также можете придумать вариант как коллекцию одного, так что все приятные вещи, которые вы можете делать с коллекциями, которые вы можете делать с опциями, включая преобразование их в другие типы коллекций, сгиб и т. Д. Хорошее использование для него в ваш случай, может быть, принять решение позвонить или НЕ вызвать метод java.

def myFn(findingFrame: FindingFrame) = { findingFrame.in.foreach{i => javaMethod(i) } }

В приведенном выше вы можете использовать карту, или матч/случай вместо этого.

2

Я думаю, что ваша проблема заключается не столько в scala.Int против java.lang.Integer, сколько в использовании типов опций.

Короткий ответ: это, кажется, работает для меня Валу я: Int = 7 новый findingFrame ("Foo", Некоторые из них (я), None)

Длинный ответ: Типы Scala Вариант являются оболочками, которые может содержать или не содержать значение своего типового типа. Идея состоит в том, чтобы избежать нулевых значений Java. Опция может быть либо None (не содержит значения), либо Some [T] (содержит значение) - None, а Some - подклассы Option здесь. Поэтому вам просто нужно обернуть scala Int в Some, как в коде выше.

1
scala> val i: java.lang.Integer = 1 
i: Integer = 1 

scala> val id: Option[java.lang.Integer] = Some(i) 
id: Option[Integer] = Some(1) 

scala> id.get.getClass 
res9: Class[_ <: Integer] = class java.lang.Integer 
2

Scala, используя поле для примитивных типов, может передавать непосредственно на Java.

В следующем коде, типа я на самом деле int и int может передается Random, которая требует long так int будет конвертировать в long автоматически.

val i = 3 
println(i.getClass) 
println(new Random(i)) 

Int следующий код, используя Option[Integer], Option[Integer].get получит значение, внутри которого является тип Integer. И Integer не может быть передан непосредственно long, а мы можем использовать .toLong, чтобы преобразовать его в Long, который автоматически будет удален до long.

val oi: Option[Integer] = new Some(3) 
println(oi.getClass) 

println(new Random(oi.get.toLong)) 
0

Все, что вам нужно сделать, это передать значение int конструктору Integer(). Теперь вы можете передать этот новый объект.

scala> val n = 20 
n: Int = 20 

scala> new Integer(n) 
res0: Integer = 20 

scala> res0.getClass 
res1: Class[_ <: Integer] = class java.lang.Integer 
Смежные вопросы