我不知道为什么以下代码无法编译,这是错误消息:
错误:(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)
})
}
答案 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
同时涉及map
和flatten
,因此在某些情况下可能需要更多的类型注释。整个代码在注释了功能参数(codecClassName: String)
之后起作用。
请注意另一个变化-如果内部函数返回flatMap
类型的Option
与map
相同,如果该函数返回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