说我有一个方法:

def foo(t: java.lang.reflect.Type) = ???

我想在(Int, Int)上调用它。

这样的通话看起来如何?我试过了:
foo(typeOf[(Int, Int)])

但它似乎不起作用,因为它返回的是scala.reflect.runtime.universe.Type而不是java.lang.reflect.Type

最佳答案

您应该使用classOfPredef方法(默认情况下已导入):

"".getClass
// Class[_ <: String] = class java.lang.String

classOf[String]
// Class[String] = class java.lang.String

请注意,即使您要调用接受foojava方法,也不要自己创建诸如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 方所看到的,您不需要像classOftypeOf这样的辅助函数。

类型擦除

正如@cmbaxter指出的:由于类型擦除,您无法获取TypeTuple2[Int, Int]-Type不包含有关类型参数的信息。您将获得TypeTuple2:
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/

10-16 02:56