2016-11-15 5 views
2

私はscalaに慣れていて、scalaとJavaを一緒に使っています。スカラ整数をJava整数に変換するには?

Integer(java.long.Integer)を受け入れるメソッドにスカラIntを渡そうとしています。それらは異なる型のものなので、コンパイラはエラーを出します。

/* 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]) 

私はこの問題を解決する方法がわからないです

を私は[java.lang.Integerの] .instanceOfを使用してみましたが、これは動作しません。どちらか.. ..誰かが私を助けてくださいことはできますか? ありがとうございます。

+0

投稿したコード行が混乱しています。 Javaメソッドとは何ですか?どのようなコード行に間違いがありますか?正確なエラーメッセージは何ですか?ケースクラスはそれと何が関係していますか?これは 'Option [Integer]'(Scalaの 'Option'と' Java' Integer'の奇妙な混合物)をとります。 – Jesper

+0

caseクラスは、 'Integer'ではなく' Option [Integer] 'を取ります。 'Option'は' Integer'ではないので、あなたは他のものにキャストできません。 – Jesper

答えて

1

私はほとんどの他の答えがそれをカバーすると思います、あなたの問題はオプションの使用で、スカラとjava整数の違いではありません。あなたはオプションで行うことができます多くのものが、たとえば、あります: は、与えられた:

val optionOfInteger = Option(5) 
  • (醜い)(val i = optionOfInteger.get)だけでgetを使用、あなたのオプションは、常に値を持っていると仮定し
  • は、デフォルト値を適用します(あなたが何か他のもの(val optionOfString = optionOfInteger.map(_.toString)のオプションに整数のオプションをマッピングすることができval i = optionOfInteger.getOrElse(0)
  • あなたは1つのコール(val str = optionOfInteger.fold("Nothing")(_.toString)
  • で最後の二つの両方を行うことができます
  • Optionはコレクションを1つのコレクションと考えることもできます。オプションで行うことができるコレクションを他のコレクションに変換したり、折りたたんだりするなど、すばらしいことができます。 あなたの場合は、Javaメソッドを呼び出すかどうかを決定することがあります。あなたの代わりにマップ、または一致/ケースを使用することができ、上記で

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

2

あなたの問題は、scala.Intとjava.lang.Integerの違いだと思いますが、Optionの種類を使用していると思います。

短い答え:

長い答え(一部(I)、なし、 "foo" という)のInt = 7 新しいfindingFrame: 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

プリミティブ型のスカラを使用すると、Javaに直接渡すことができます。次のコードで

は、I型は、実際にintあり、そしてintlongint以降は自動的にlongに変換する必要がどのランダムに渡すことができます。以下のコードのInt

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

Option[Integer]を使用して、Option[Integer].getIntegerを入力している内部値を取得します。またIntegerlongに直接渡すことはできませんが、.toLongを使用してLongに変換すると、自動的にlongにunboxされます。

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

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

あなたがする必要があるのは、Integer()のコンストラクタにint値を渡すことだけです。この新しいオブジェクトを今すぐ渡すことができます。

scala> val n = 20 
n: Int = 20 

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

scala> res0.getClass 
res1: Class[_ <: Integer] = class java.lang.Integer 
関連する問題