说我有一个方法:
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
accepts的方法,也不应创建自己的方法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
如您在呼叫侧所见,您不需要诸如classOf
或的帮助器功能typeOf
。
作为@cmbaxter指出:由于类型擦除你不能得到Type
的Tuple2[Int, Int]
-Type
不包含有关类型参数的信息。您将获得Type
为Tuple2
:
classOf[(Int, Int)] == classOf[(String, String)]
// Boolean = true
classOf[(Int, Int)] == classOf[(_, _)]
// Boolean = true
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句