说我有一个方法:
def foo(t: java.lang.reflect.Type) = ???
Run Code Online (Sandbox Code Playgroud)
我想打电话给它(Int, Int).
这样的电话怎么样?我试过了:
foo(typeOf[(Int, Int)])
Run Code Online (Sandbox Code Playgroud)
但它似乎没有工作,因为它返回scala.reflect.runtime.universe.Type而不是java.lang.reflect.Type.
您应该使用classOf的方法Predef(它在默认情况下进口):
"".getClass
// Class[_ <: String] = class java.lang.String
classOf[String]
// Class[String] = class java.lang.String
Run Code Online (Sandbox Code Playgroud)
请注意foo,即使您要调用java接受的方法,也不应创建自己的方法java.lang.reflect.Type.你可以使用ClassTag:
import reflect.{ClassTag, classTag}
def javaFoo(t: java.lang.reflect.Type) = t.toString
def foo[T: ClassTag]() = javaFoo(classTag[T].runtimeClass)
foo[String]
// String = class java.lang.String
Run Code Online (Sandbox Code Playgroud)
正如您在呼叫方面所看到的,您不需要像classOf或那样的辅助功能typeOf.
作为@cmbaxter指出:由于类型擦除你不能得到Type的Tuple2[Int, Int]- Type不包含有关类型参数的信息.您将获得Type为Tuple2:
classOf[(Int, Int)] == classOf[(String, String)]
// Boolean = true
classOf[(Int, Int)] == classOf[(_, _)]
// Boolean = true
Run Code Online (Sandbox Code Playgroud)