首页 > 解决方案 > Scala相当于Java`Class`类?

问题描述

在 Java 中,有一个Class<T>类表示类。当您需要在运行时动态进行一些类检查时,它很有用,例如,如果某个接口可以接受不同数量的参数并且它期望参数具有特定类型:那么该接口可以返回一个Class对象列表来指定其要求。

显然,它在 Scala 中也可用,但只是作为 Java 类的别名)。可以在 Scala 中使用它(或者一般来说,Class在纯 Scala 代码中的类)中使用它,还是有一种更惯用的方式来实现同样的事情?

有关更多上下文,这就是我的想法:

trait BuiltInFunction[Node] {
  def symbol: String
  def arity: Int
  def argumentTypes: List[Class[Node]]
  def apply(args: List[Node]): Node
}

BuiltInFunction表示函数,每个函数可以有不同数量的参数,并期望参数是 的不同子类型NodeargumentTypes如果系统遇到一个函数,它将通过调用apply带有这些参数的方法 来确保将其应用于正确类型的参数(由 定义)。

在 Scala 中使用Class正确的方法吗?

标签: scalascala-reflect

解决方案


如果您不需要 Scala 特定的细节(区分属性和方法、隐式等),使用Class非常好;如果不是,它就不能scala.Predef作为别名使用!

如果你这样做,会有Scala 反射,但老实说,根据我的经验,它比基于 JavaClass的反射更难使用。如果你能同时使用我更喜欢Class.

奥托:

  1. List[Class[Node]]如果你不正确

    期望参数是 Node 的不同子类型

    应该是List[Class[_ <: Node]]

  2. Class仅反映擦除后的类,例如classOf[List[String]]classOf[List[Int]]是相同的。如果你需要区分它们Class是不够的。


推荐阅读