我有这段代码
"123".getClass.asInstanceOf[Class[String]]
"123".getClass.asInstanceOf[classOf[String]]//compilation error, classOf not defined
但是,我可以这样使用classOf
println(classOf[String])
我在这里有点困惑,classOf [T]和Class [T]
之间有什么区别非常感谢提前
答案 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])