方法flatMap没有类型参数

时间:2016-02-02 08:29:01

标签: scala

我不知道为什么以下代码无法编译,这是错误消息:

  

错误:(29,7)方法flatMap没有类型参数:(f:String =>选项[B])选项[B]存在,因此它可以应用于参数(String => Some [Class] [?0]] forSome {type?0&lt ;: org.apache.hadoop.io.compress.CompressionCodec})
       ---因为---
      参数表达式的类型与形式参数类型不兼容;        found:String =>一些[类[?0]] forSome {type?0&lt ;: org.apache.hadoop.io.compress.CompressionCodec}
       required:String =>选项[?B]
          a.flatMap(codecClassName => {
            ^

和代码

  def f(a: Option[String]): Unit = {
    a.flatMap(codecClassName => {
      val codecFactory = new CompressionCodecFactory(new Configuration())
      val codecClass = codecFactory.getCodecClassByName(codecClassName)
      if (codecClass == null) {
        throw new RuntimeException("Unknown or not supported codec:" + codecClassName)
      }
      Some(codecClass)
    })
  }

2 个答案:

答案 0 :(得分:1)

这似乎与getClass和classOf没有返回完全相同的事实有关。有关详细信息,请参阅Scala equivalent of Java java.lang.Class<T> Object

为了找到解决方法,我遇到了Scala Getting class type from string representation

那怎么样:

val codecClass = Manifest.classType(codecFactory.getCodecClassByName(codecClassName))

答案 1 :(得分:0)

这应该有效。 flatMap同时涉及mapflatten,因此在某些情况下可能需要更多的类型注释。整个代码在注释了功能参数(codecClassName: String)之后起作用。

请注意另一个变化-如果内部函数返回flatMap类型的Optionmap相同,如果该函数返回Option内部的内容(即,将选项展平) )(请参见下文)。

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.io.compress.{CompressionCodec, CompressionCodecFactory}
...
  def f(a: Option[String]): Option[Class[_ <: CompressionCodec]] = {
    a.map((codecClassName: String) => {
      val codecFactory = new CompressionCodecFactory(new Configuration())
      val codecClass   = codecFactory.getCodecClassByName(codecClassName)
      if (codecClass == null) {
        throw new RuntimeException("Unknown or not supported codec:" + codecClassName)
      }
      codecClass
    })
  }

如上所述显示flatMap和地图之间的关系:

scala> val opt: Option[Int] = Some(1)
opt: Option[Int] = Some(1)

scala> opt.map((i: Int) => i + 1)
res0: Option[Int] = Some(2)

scala> val opt2: Option[Int] = None
opt2: Option[Int] = None

scala> opt.flatMap((i: Int) => Some(i + 1))
res1: Option[Int] = Some(2)

scala> opt2.map((i: Int) => i + 1)
res3: Option[Int] = None

scala> opt2.flatMap((i: Int) => Some(i + 1))
res2: Option[Int] = None