classOf [T]和Class [T]有什么区别

时间:2014-10-13 11:29:58

标签: scala

我有这段代码

"123".getClass.asInstanceOf[Class[String]]
"123".getClass.asInstanceOf[classOf[String]]//compilation error, classOf not defined

但是,我可以这样使用classOf

println(classOf[String])

我在这里有点困惑,classOf [T]和Class [T]

之间有什么区别

非常感谢提前

3 个答案:

答案 0 :(得分:8)

Class[T]是一种类型; classOf[T]是此类型的值。因此,您无法使用classOf[String]作为类型参数(在[]之间),就像您无法写"123".getClass.asInstanceOf[new Object]一样;并且您无法使用Class[T]作为正常参数(在()之间),就像您无法写println(String)一样。

答案 1 :(得分:1)

这是两个完全不同的东西:classOf[]返回给定参数的类,而Class[]是类的对象。

在Java中,这映射到

Class[]    <-> Class<>
classOf[X] <-> X.class

答案 2 :(得分:0)

classOf[T]Class[T]类型的值。换句话说,classOf[T]: Class[T]。例如:

scala> val strClass = classOf[String]
strClass: Class[String] = class java.lang.String

scala> :t strClass
Class[String]

这允许人们约束反射方法中使用的参数:

scala> :paste
// Entering paste mode (ctrl-D to finish)

sealed trait Fruit
case class Apple(name: String) extends Fruit
case class Pear(name: String) extends Fruit

// Exiting paste mode, now interpreting.

defined trait Fruit
defined class Apple
defined class Pear

scala> def fruitFunction(kind: Class[_ <: Fruit]) { println("Fruity...") }
fruitFunction: (kind: Class[_ <: Fruit])Unit

scala> fruitFunction(classOf[Apple])
Fruity...

scala> fruitFunction(classOf[String])
<console>:13: error: type mismatch;
 found   : Class[String](classOf[java.lang.String])
 required: Class[_ <: Fruit]
       fruitFunction(classOf[String])