4

在 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(_))

类型不匹配; found : Int required: java.lang.Object 注意:隐式存在于 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)为什么会这样?据我所知,formap例程没有太大区别!

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 引擎当时会切断整个东西,所以用你的想象力将它们替换回来)。

4

1 回答 1

3

类型不匹配准确地告诉您问题:您可以转换为java.lang.Integer不能转换为java.lang.Object. 所以告诉它你想Integer在路上找一个地方。例如:

groupOfObjects.map(_.getNeededInt: java.lang.Integer).map(libraryObject.libraryMethod(_))

(符号——当在or或参数方法value: Type的声明之外使用时——意味着如果可能,将其视为该类型;要么需要是 的子类,要么需要有一个可以转换为某物的隐式转换适当的类型。)valvarvaluevalueTypevalue

于 2012-05-08T20:41:26.967 回答