如何在Scala中使用类型参数获取Class的类对象?

时间:2018-02-16 01:11:09

标签: scala type-erasure

我是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[_, _]]

是什么给出的?如何获取需要类型参数的类的类对象?

1 个答案:

答案 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中的通配符。