2017-07-03 117 views
0

奇怪的情況下這是我的代碼直&簡單:Scala ClassTag&classOf和type參數。泛型

package scalaproj 
import scala.reflect._ 

case class MyClass() {} 

def bar[T](cls : Class[T]) = println(cls) 
def foobar[T: ClassTag] = println(classTag[T]) 

bar(classOf[MyClass]) 
foobar[MyClass] 

Results: class scalaproj.GetFields$MyClass$2 
     scalaproj.GetFields$MyClass$2 

現在,我想離不開著名的錯誤如下:「需要類類型而T3發現」

def foo[T] = println(classOf[T]) 
foo[MyClass] 

FOO只是一個採用通用類型參數並且不需要值參數的函數。我認爲這很奇怪,因爲這兩個例子可以工作,並且所有的靈活性都融入了Scala語言和它的泛型。

更新:

只是爲了進一步指定陌生感:

def foo1[T](t : T) = {} // no compile error 

def foo2[T](): List[T] = { List[T]() } // no compile error 

def foo3[T](): T = { T() } // compile error: "not found: value T" 

一個很好的解釋表示讚賞。

回答

2

你不能,因爲classOf不能使用任意類型(而你的T是一個任意類型)。

例如:

scala> classOf[Int with String] 
<console>:15: error: class type required but Int with String found 
     classOf[Int with String] 
      ^

可以實現同樣的事情ClassTag#runtimeClass

def foo[T: ClassTag] = println(classTag[T].runtimeClass)