加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala / Java互操作性:如何处理包含Int / Long(原始类型)的选项

发布时间:2020-12-16 18:38:27 所属栏目:安全 来源:网络整理
导读:给定 Scala中的服务: class ScalaService { def process1(s: Option[String],i: Option[Int]) { println("1: " + s + "," + i) }} 这是从Java使用的: public class Java { public static void main(String[] args) { ScalaService service = new ScalaServ
给定 Scala中的服务:

class ScalaService {
  def process1(s: Option[String],i: Option[Int]) {
    println("1: " + s + "," + i)
  }
}

这是从Java使用的:

public class Java {
    public static void main(String[] args) {
        ScalaService service = new ScalaService();

        // This works,but it's confusing
        {
            scala.Option<String> so = scala.Option.apply("Hello");
            scala.Option<Object> io = scala.Option.apply((Object) 10);
            service.process1(so,io);
        }

        // Would be OK,but not really nice
        {
            scala.Option<Object> so = scala.Option.apply((Object) "Hello");
            scala.Option<Object> io = scala.Option.apply((Object) 10);
            service.process1(so,io); // Does not compile
        }

        // The preferred way
        {
            scala.Option<String> so = scala.Option.apply("Hello");
            scala.Option<Integer> io = scala.Option.apply(10);
            service.process1(so,io); // Does not compile
        }

    }
}

我想避免以不同的方式处理原始类型和非原始类型.

所以我尝试通过添加另一种方法来解决这个问题:

def process2(s: Option[String],i: Option[java.lang.Integer]) {
  print("2: ")
  process1(s,i.map(v => v.toInt))
}

但这需要该方法的不同名称.
从调用者的角度来看,这可能会让人感到困惑,还有其他可能吗?

我正在使用Scala 2.10.1和Java 1.6

解决方法

方法签名也会有点混乱,但你可以使用模式匹配来处理各种类型 – 如:

class ScalaService {
  def process1(s: Option[String],i: Option[Any]) {
    i match {
      case Some(i2:Int) => processInternal(s,Some(i2))
      case Some(i2:java.lang.Integer) => processInternal(s,Some(i2.intValue))
      case _ => processInternal(s,None) // or throw exception if you prefer
    }

    def processInternal(s:Option[String],i:Option[Int]) { 
      println("1: " + s + "," + i) 
    }
  }
}

另外,我不确定从java调用,但也许从java.lang.Integer到Int的隐式转换也可以工作?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读