Scala等价于Java"Class"类吗



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

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

对于更多的上下文,这就是我所想的:

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

BuiltInFunction表示每个函数可以具有不同数量的自变量,并且期望自变量是Node的不同子类型。如果系统遇到一个函数,它将通过用这些参数调用apply方法来确保它被应用于正确类型的参数(如argumentTypes所定义的(。

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

如果您不需要Scala特定的细节(区分属性和方法、implicits等(,使用Class是完全可以的;如果不是,它就不能作为别名在scala.Predef中使用!

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

OTOH:

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

    期望参数是节点的不同子类型

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

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

最新更新