【问题标题】:Inferred parameter types in scalascala中的推断参数类型
【发布时间】:2016-01-14 16:30:18
【问题描述】:

以下代码生成类型不匹配错误。我不明白为什么。

var navigablemap=rst.getFamilyMap("a".getBytes())
var list = new ListBuffer[Long]()
navigablemap.keySet().forEach((e:Array[Byte]) => list+=Bytes.toLong(e))

navigablemap 的类型为 NavigableMap[Array[Byte], Array[Byte]]。 人们会期望 e 具有 Array[Byte]

类型

编译器报告以下错误消息。

类型不匹配;找到:Array[Byte] ⇒ list.type(底层类型 Array[Byte] ⇒ list.type)需要:java.util.function.Consumer[_ >: Array[Byte]]

更新:以下工作。

var keys=navigablemap.keySet()
var keysIterator=keys.iterator()
while (keysIterator.hasNext){ 
  var e=keysIterator.next()
  list+=Bytes.toLong(e)
}

既然在我尝试学习 scala 时简洁是我的目标之一,那么是否有针对上述内容的 scala-one-liner ?

【问题讨论】:

  • 你认为(e:Array[Byte]) 在做什么? (所以它不是关于推断的参数类型,而是明确的)
  • 你不是在scala中使用java api吗?你不能简单地传递需要 java lambda 的 scala lambda。
  • 为什么编译器会认为类型不是Array[Byte]?推断的类型与预期的(和指定的)类型不同。
  • @Łukasz 你能具体点吗?

标签: scala apache-spark hbase


【解决方案1】:

这是一个愚蠢的错误。正如 Lukasz 对这个问题的评论,scala lambdas 不能取代 java lambda。供将来参考,这是可行的解决方案。

var navigablemap=rst.getFamilyMap("a".getBytes())
val list = new ListBuffer[Long]()
var keys=navigablemap.keySet()
val scalaKeys=asScalaSet(keys)
scalaKeys.foreach(x => list+=Bytes.toLong(x))

转换asScalaSet 很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多