2016-11-15 429 views
2

我对scala很感兴趣,并且一起使用scala和Java。如何将一个Scala Int转换为一个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]) 

我尝试使用.instanceOf [java.lang.Integer中],但这并不工作,要么..

我不知道如何解决这个..有人可以帮我吗? 谢谢。

+0

您发布的代码行很混乱。 Java方法究竟是什么?什么行代码确实给你一个错误?什么是确切的错误信息?案例分类与它有什么关系?它需要一个'Option [Integer]'(一个Scala'Option'和一个Java'Integer'的奇怪混合体)。 – Jesper

+0

案例类采用“Option [Integer]”而不是“Integer”。一个'Option'不是一个'Integer',所以你不能把一个投向另一个。 – Jesper

回答

1

我认为大多数其他答案覆盖它,你的问题是使用选项,而不是与scala和java整数之间的差异。有很多事情你可以选择做,例如: 考虑:

val optionOfInteger = Option(5) 
  • (丑)假设你的选择总是有一个值,只需使用get(val i = optionOfInteger.get
  • 应用一个默认值:( val i = optionOfInteger.getOrElse(0)
  • 可以整数的选项映射成别的选项(val optionOfString = optionOfInteger.map(_.toString)
  • 您可以在一个呼叫(val str = optionOfInteger.fold("Nothing")(_.toString)
  • 一举两得的最后两个
  • 您也可以将Option看作一个集合,因此您可以对Options执行的集合进行所有漂亮的事情,包括将其转换为其他类型的集合,折叠等。 在其中的一个很好的用法你的情况,可能是决定调用或不调用java方法。

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

在上面你可以使用地图,或匹配/箱代替。

2

我认为你的问题不是关于scala.Int与java.lang.Integer有关,而是使用Option类型。

简短的回答:这似乎为我 VAL工作我:INT = 7 新findingFrame( “富”,有些(我),无)

龙答: 斯卡拉选项类型的包装是可能包含或不包含其泛型类型的值。这个想法是为了避免Java的空值。 一个选项可以是None(不包含值)或Some [T](包含值) - None和一些是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,而int可以传递给随机这就需要long因为int会自动转换为long

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

诠释下面的代码,使用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 
相关问题