【问题标题】:Get Class<T> at compile time?在编译时获取 Class<T>?
【发布时间】:2011-11-13 06:41:18
【问题描述】:

在 Java 中你可以这样写:

Class<SomeClass> foo = SomeClass.class;

我正在使用 Scala 并想要更多:我想在编译时获得一个方法(及其泛型类型),如下所示:

val foo : Method[...] = SomeClass.class.someMethod

甚至:

val foo : Method[...] = someObject.class.someMethod

有没有办法在 Scala 中做这样的事情?

【问题讨论】:

  • .class 不是在运行时而不是编译时运行吗?
  • @Kipton Barros In Java Type.class(new Type()).getClass() 的编译时“等价物”

标签: scala reflection compile-time


【解决方案1】:

对于需要 Method 实例的 Java 库的互操作可能是唯一的例外,在 Scala 中永远不需要这样做。

如果您需要传递一个方法以供以后调用;然后部分应用它来创建一个FunctionN 实例,通过一个别名参数传递它,或者在第一种情况下将它直接创建为一等函数。

如果您需要反思方法以便可以规避私有可见性,也许是为了测试,那么您确实应该重构您的设计,以避免首先出现这种可见性限制。

如果您只是在探索 Scala,并了解概念与 java 的比较。或者,如果您不幸陷入互操作的糟糕情况,那么与SomeClass.class 等效的构造是classOf[SomeClass]。希望你永远不需要它:)

【讨论】:

    【解决方案2】:

    对于一个类:

    val classOfClass = classOf[SomeClass]
    

    对于一个对象(使用 getClass 的区别很重要,否则伴生对象的类将无法访问):

    val classOfObject = SomeClass.getClass
    

    假设代码如下:

    class SomeClass {
      def someMethod() {}
    }
    
    object SomeClass
    

    在这之后你可以使用像Class#getMethod(String,Class&lt;?&gt;...)这样的Java反射操作(假设someMethod没有参数):

    val method = classOfClass.getMethod("someMethod")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多