2014-10-13 29 views
5

Ho questo codicequal è la differenza tra classOf [T] e Classe [T]

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

Tuttavia, posso usare classOf in questo modo

println(classOf[String]) 

Sono po 'confuso qui, qual è la differenza tra classOf [T] e Classe [T]

Molte grazie in anticipo

risposta

7

Class[T] è un tipo; classOf[T] è un valore di questo tipo. Pertanto non è possibile utilizzare classOf[String] come parametro di tipo (tra [ e ]), così come non è possibile scrivere "123".getClass.asInstanceOf[new Object]; e non è possibile utilizzare Class[T] come argomento normale (tra ( e )), proprio come non è possibile scrivere println(String).

1

Questo sono due completa diffe affitta oggetti: classOf[] restituisce la classe dell'argomento dato mentre Class[] è un oggetto della classe.

In Java questo associa ad

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

errato. 'x.getClass()' corrisponde a 'x.getClass()' in Scala (parentesi opzionale). –

+0

Questo non è corretto. 'classOf [X]' corrisponde a 'X.class' in Java - restituisce l'oggetto di classe' Class [X] '. –

+0

Corretta la mia risposta dopo i commenti. –

0

A classOf[T] è un valore di tipo Class[T]. In altre parole, classOf[T]: Class[T]. Ad esempio:

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

scala> :t strClass 
Class[String] 

Questo permette di vincolare parametri utilizzati nei metodi riflettenti:

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]) 
Problemi correlati