【问题标题】:How to convert a scala Int to a java Integer?如何将 scala Int 转换为 java Integer?
【发布时间】:2016-11-15 09:07:10
【问题描述】:

我是 scala 的新手,并且一起使用 scala 和 Java。

我正在尝试将 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],但这也不起作用..

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

【问题讨论】:

  • 您发布的代码行令人困惑。 Java方法到底是什么?哪一行代码给你一个错误?确切的错误信息是什么?案例类与它有什么关系?它需要一个 Option[Integer](Scala Option 和 Java Integer 的奇怪混合)。
  • 案例类采用Option[Integer] 而不是Integer。 Option 不是 Integer,因此您不能将一个转换为另一个。

标签: java scala integer int


【解决方案1】:

您需要做的就是将 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

【讨论】:

    【解决方案2】:

    我认为大多数其他答案都涵盖了它,您的问题是使用 Option,而不是 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) } }

    在上面你可以使用 map 或 match/case 来代替。

    【讨论】:

      【解决方案3】:

      我认为您的问题不在于 scala.Int 与 java.lang.Integer,而在于 Option 类型的使用。

      简短回答:这似乎对我有用 val i: Int = 7 新的findingFrame("foo", Some(i), None)

      长答案: scala 选项类型是包装器,可能包含也可能不包含其泛型类型的值。这个想法是避免 Java 的空值。 Option 可以是 None (不包含值)或 Some[T] (包含值) - None 和 Some 是 Option 的子类。所以你只需要像上面的代码一样将你的 scala Int 包装成 Some 。

      【讨论】:

        【解决方案4】:

        Scala 对原始类型使用 box,它可以直接传递给 Java。

        在下面的代码中,类型 i 实际上是 int,int 可以传递给需要 long 的 Random,因为 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))
        

        【讨论】:

          【解决方案5】:
          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
          

          【讨论】:

            【解决方案6】:

            如果自动转换对您不起作用(例如,如果您有一些中间步骤并且类型检查器无法立即找到最终类型),您可以使用 int2Integer(或 long2Long 表示 Long ) 来自默认导入的scala.language.implicitConversions (https://docs.scala-lang.org/tour/implicit-conversions.html)

            【讨论】:

              猜你喜欢
              • 2010-10-27
              • 2021-08-20
              • 1970-01-01
              • 2015-10-02
              • 2013-11-26
              • 2011-01-27
              • 2010-10-31
              相关资源
              最近更新 更多