2014-10-13 15 views
5

tôi có mã nàynhững gì là sự khác biệt giữa classOf [T] và Class [T]

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

Tuy nhiên, tôi có thể sử dụng classOf theo cách này

println(classOf[String]) 

tôi chút nhầm lẫn ở đây, sự khác biệt giữa classOf [T] và class [T]

Nhiều cảm ơn trước

Trả lời

7

Class[T] là một loại; classOf[T] là giá trị của loại này. Vì vậy, bạn không thể sử dụng classOf[String] làm thông số loại (giữa []), giống như bạn không thể viết "123".getClass.asInstanceOf[new Object]; và bạn không thể sử dụng Class[T] làm đối số thông thường (giữa ()), giống như bạn không thể viết println(String).

1

là gì Đây là hai hoàn thành nhiều loại kh thuê những thứ: classOf[] trả về lớp của đối số đã cho trong khi Class[] là một đối tượng của lớp.

Trong Java này bản đồ để

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

sai. 'x.getClass()' tương ứng với 'x.getClass()' trong Scala (dấu ngoặc đơn tùy chọn). –

+0

Điều này không đúng. 'classOf [X]' tương ứng với 'X.class' trong Java - nó trả về đối tượng của lớp' Class [X] '. –

+0

Đã sửa câu trả lời của tôi sau khi nhận xét. –

0

A classOf[T] là giá trị của loại Class[T]. Nói cách khác, classOf[T]: Class[T]. Ví dụ:

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

scala> :t strClass 
Class[String] 

này cho phép một để hạn chế các thông số được sử dụng trong phương pháp phản xạ:

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]) 
Các vấn đề liên quan