说我有一个方法:
def foo(t: java.lang.reflect.Type) = ???
我想在
(Int, Int)
上调用它。这样的通话看起来如何?我试过了:
foo(typeOf[(Int, Int)])
但它似乎不起作用,因为它返回的是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
请注意,即使您要调用接受
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
如您在 call 方所看到的,您不需要像
classOf
或typeOf
这样的辅助函数。类型擦除
正如@cmbaxter指出的:由于类型擦除,您无法获取
Type
的Tuple2[Int, Int]
-Type
不包含有关类型参数的信息。您将获得Type
的Tuple2
:classOf[(Int, Int)] == classOf[(String, String)]
// Boolean = true
classOf[(Int, Int)] == classOf[(_, _)]
// Boolean = true
关于scala - 如何从Scala类型获取java.lang.reflect.Type?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20743197/