【问题标题】:Scala - mapping a list of integers to a method that receives java.lang.ObjectScala - 将整数列表映射到接收 java.lang.Object 的方法
【发布时间】: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) 为什么会这样?据我所知,formap 例程并没有太大区别!

2) 另外:You may wish to use a type ascription: x: java.lang.Integer 是什么意思?我该怎么做?我尝试明确指定类型,例如x: Int =&gt; x.toInt,但这太错误了。那么什么是“类型归属”呢?

更新:

T.Grottker 提出的解决方案增加了它。我遇到的错误是这样的:

  • 缺少扩展函数的参数类型 ((x$3) => x$3.asInstanceOf[java.lang.Object])
  • 缺少扩展函数的参数类型 ((x$3) => x$3.asInstanceOf{#null#}[java.lang.Object]{#null#}) {#null#}

我想,天哪,它只是在增长!谁能解释所有这些&lt;null&gt; 的含义?我只是想知道真相。 (注意:我不得不用 # 替换 刹车,因为那时 SO 引擎会切断整个东西,所以请发挥你的想象力将它们替换回来)。

【问题讨论】:

  • 您是否尝试在 groupOfObjects.map(_.getNeededInt).map(libraryMethod( _.asInstanceOf[java.lang.Object]) 中进行显式转换?
  • listOfInts.map(x =&gt; libraryObject.libraryMethod(x.toInt)) 应该可以工作
  • 只是猜测。这可能是因为您尝试使用原始类型 int 而不是对象调用 java 方法吗?在 Java 领域,你不能同时进行自动拆箱和“扩大”,不确定这是否同样适用于 Scala。
  • @elbowich 不,不起作用。你试过了吗?
  • @Grottker 不,它让我们更深入地了解谜团,请参阅更新。它在您的环境中有效吗?

标签: scala


【解决方案1】:

类型不匹配告诉您确切的问题:您可以转换为java.lang.Integer,但不能转换为java.lang.Object。所以告诉它你想在途中的某个地方请求Integer。例如:

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

(符号value: Type--当在valvar 或参数方法的声明之外使用时--表示将value 视为该类型,如果可能的话;value 要么需要是Type 的子类,或者需要有一个可以将value 转换为适当类型的隐式转换。)

【讨论】:

  • 好的,很好,谢谢!这是一个非常方便的概念。我怎么可能错过了!现在你扩大了我的理解。通过回答第一个问题来进一步扩大范围怎么样?
  • for 结构是否在内部使用这种或类似的视图转换?
  • @noncom - 我不知道为什么它适用于 for 循环;也许类型推断意识到它必须是 Object 的子类?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2020-05-25
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多