【发布时间】:2012-05-08 19:00:58
【问题描述】:
在 Scala-IDE 中工作,我有一个 Java 库,其中一个方法接收 java.lang.Object。我想将Int 值列表映射到它。唯一可行的解决方案是:
val listOfInts = groupOfObjects.map(_.getNeededInt)
for(int <- listOfInts) libraryObject.libraryMethod(int)
而下面的一个:
groupOfObjects.map(_.getNeededInt).map(libraryMethod(_)
甚至
val listOfInts = groupOfObjects.map(_.getNeededInt)
val result = listOfInts.map(libraryObject.libraryMethod(_))
说
类型不匹配;找到:需要 Int:java.lang.Object 注意:an 隐含存在于 scala.Int => java.lang.Integer,但方法 继承自 Object 会变得不明确。这是为了避免一个 将任何 scala.Int 转换为任何 AnyRef 的毯子隐式。你 不妨使用类型归属:
x: java.lang.Integer。
类似的东西
val result = listOfInts.map(libraryObject.libraryMethod(x => x.toInt))
或
val result = listOfInts.map(libraryObject.libraryMethod(_.toInt))
也不行。
1) 为什么会这样?据我所知,for 和 map 例程并没有太大区别!
2) 另外:You may wish to use a type ascription: x: java.lang.Integer 是什么意思?我该怎么做?我尝试明确指定类型,例如x: Int => x.toInt,但这太错误了。那么什么是“类型归属”呢?
更新:
T.Grottker 提出的解决方案增加了它。我遇到的错误是这样的:
- 缺少扩展函数的参数类型 ((x$3) => x$3.asInstanceOf[java.lang.Object])
- 缺少扩展函数的参数类型 ((x$3) => x$3.asInstanceOf{#null#}[java.lang.Object]{#null#}) {#null#}
我想,天哪,它只是在增长!谁能解释所有这些<null> 的含义?我只是想知道真相。 (注意:我不得不用 # 替换 刹车,因为那时 SO 引擎会切断整个东西,所以请发挥你的想象力将它们替换回来)。
【问题讨论】:
-
您是否尝试在 groupOfObjects.map(_.getNeededInt).map(libraryMethod( _.asInstanceOf[java.lang.Object]) 中进行显式转换?
-
listOfInts.map(x => libraryObject.libraryMethod(x.toInt))应该可以工作 -
只是猜测。这可能是因为您尝试使用原始类型
int而不是对象调用 java 方法吗?在 Java 领域,你不能同时进行自动拆箱和“扩大”,不确定这是否同样适用于 Scala。 -
@elbowich 不,不起作用。你试过了吗?
-
@Grottker 不,它让我们更深入地了解谜团,请参阅更新。它在您的环境中有效吗?
标签: scala