我是Scala的新手,并且厌倦了Java,我正在嘲笑一些语义。我正在尝试获取SequenceFileOutputFormat的类对象。
其他堆栈溢出帖子说要简单地执行以下操作:
classOf[SequenceFileOutputFormat]
产生错误:
class SequenceFileOutputFormat takes type parameters
好的,所以它需要参数类型,所以我做了以下几点:
classOf[SequenceFileOutputFormat[String, String]]
产生错误:
[error] found : Class[org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat[String,String]](classOf[org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat])
[error] required: Class[_ <: org.apache.hadoop.mapred.OutputFormat[_, _]]
是什么给出的?如何获取需要类型参数的类的类对象?
答案 0 :(得分:1)
使用hadoop-mapreduce-client-core
&#34; 3.0.0&#34;,在此处:
import org.apache.hadoop.mapreduce.lib.output._
object HadoopQuestion_48818781 {
def main(args: Array[String]): Unit = {
val c = classOf[SequenceFileOutputFormat[_, _]]
println("Class: " + c)
}
}
打印:
Class: class org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
<强>解释强>
即使在编译时处理classOf[T]
,Class[T]
事物本身也是一个运行时构造,它对T
的泛型类型参数一无所知。因此,您必须为运行时擦除的类型参数添加下划线_
。这些下划线实际上只是Scala中存在类型的语法糖,但在这种特殊情况下,它们履行的角色类似于Java中的通配符。