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的隐式转换也可以工作? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |