【问题标题】:Scala autoboxing and Java MapScala 自动装箱和 Java Map
【发布时间】:2010-12-16 16:05:16
【问题描述】:

我有一个Java 方法接受Map<Long, Foo> 类型的参数。我正在尝试在 Scala 2.8.1 中为该方法编写单元测试并传入文字 Map[Long, Foo]

我的代码如下所示:

import collection.JavaConversions._
x.javaMethod(asJavaMap(Map(1L -> new Foo, 2L -> new Foo)))

编译器给我以下错误:

error: type mismatch;
found   : scala.collection.immutable.Map[scala.Long,Foo]
required: scala.collection.Map[java.lang.Long,Foo]

我也试过了

import collection.JavaConverters._
x.javaMethod(Map(1L -> new Foo, 2L -> new Foo))

import collection.JavaConversions._
x.javaMethod(Map(1L -> new Foo, 2L -> new Foo))

并得到错误:

error: type mismatch;
found   : scala.collection.immutable.Map[scala.Long,Foo]
required: java.util.Map[java.lang.Long,Foo]

我该怎么做?

【问题讨论】:

    标签: java scala autoboxing scala-java-interop


    【解决方案1】:

    报错说带有scala.Long键类型的Scala映射不能隐式转换为基于java.lang.Long的Java映射:

    found   : scala.collection.immutable.Map[scala.Long,Foo]
    required: scala.collection.Map[java.lang.Long,Foo]
    

    作为一种解决方法,您可以手动指定所需的类型:

    x.javaMethod(asJavaMap(Map((1:java.lang.Long) -> new Foo, (2:java.lang.Long) -> new Foo)))
    

    【讨论】:

    • 我不知道那个语法。每天学些新东西。谢谢。
    • 这个语法是新的吗?我只是查看了几本 Scala 书籍,但找不到。
    • 该技术被称为type ascription,它并不新鲜。你可以在这里找到一些细节:stackoverflow.com/questions/2087250/…
    • 我在我的任何 Scala 书籍(Odersky 等人、Wampler 等人或 Loverdos 等人)中都找不到任何关于它的内容。谢谢。
    猜你喜欢
    • 2011-01-19
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多