在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 =&gt; 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
,但这太错误了。那么什么是&#34;类型归属&#34;?
更新
T.Grottker提出的解决方案补充说。我得到的错误是:
和我一样,OMG,它只会增长!谁能解释所有这些
- 缺少扩展函数的参数类型(($ 3)=&gt; x $ 3.asInstanceOf [java.lang.Object])
- 缺少扩展函数的参数类型(($ 3)=&gt; x $ 3.asInstanceOf {#null#} [java.lang.Object] {#null#}){#null#}
<null>
事物在这里意味着什么?我只是想知道真相。 (注意:我必须用#替换&lt;&gt; brakets,因为SO引擎会切断整个东西,所以用你的想象来取代它们。)
答案 0 :(得分:3)
类型不匹配会告诉您确切的问题:您可以转换为java.lang.Integer
但不转换为java.lang.Object
。所以告诉它你要在途中的某个地方要Integer
。例如:
groupOfObjects.map(_.getNeededInt: java.lang.Integer).map(libraryObject.libraryMethod(_))
(符号value: Type
- 在val
或var
或参数方法声明之外使用时 - 表示将value
视为该类型,如果可能; value
要么是Type
的子类,要么需要隐式转换,可以将value
转换为适当类型的内容。)