如何从Scala类型获取java.lang.reflect.Type?

时间:2013-12-23 12:06:11

标签: scala

说我有方法:

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

我希望在(Int, Int)上调用它。

这样的电话怎么样?我试过了:

foo(typeOf[(Int, Int)])

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

2 个答案:

答案 0 :(得分:5)

您应该使用classOf的{​​{1}}方法(默认导入):

Predef

请注意,即使您要调用接受"".getClass // Class[_ <: String] = class java.lang.String classOf[String] // Class[String] = class java.lang.String 的{​​{1}}方法,也不应自行创建foo这样的方法。您可以使用java

java.lang.reflect.Type

正如您在呼叫方面所看到的,您不需要辅助功能,例如ClassTagimport 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

类型擦除

正如@cmbaxter所说:由于类型擦除,classOf无法获得typeOf - Type不包含有关类型参数的信息。您将Tuple2[Int, Int]获得Type

Type

答案 1 :(得分:0)

public class Gdx {

    //..
    public static Input input;
    //..
}

您可以将tag.mirror.runtimeClass(tag.tpe)强制转换为Class [_]或Class [T]。