scala - 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
表示函数,每个函数可以有不同数量的参数,并期望参数是 的不同子类型Node
。argumentTypes
如果系统遇到一个函数,它将通过调用apply
带有这些参数的方法 来确保将其应用于正确类型的参数(由 定义)。
在 Scala 中使用Class
正确的方法吗?
解决方案
如果您不需要 Scala 特定的细节(区分属性和方法、隐式等),使用Class
非常好;如果不是,它就不能scala.Predef
作为别名使用!
如果你这样做,会有Scala 反射,但老实说,根据我的经验,它比基于 JavaClass
的反射更难使用。如果你能同时使用我更喜欢Class
.
奥托:
List[Class[Node]]
如果你不正确期望参数是 Node 的不同子类型
应该是
List[Class[_ <: Node]]
。Class
仅反映擦除后的类,例如classOf[List[String]]
和classOf[List[Int]]
是相同的。如果你需要区分它们Class
是不够的。
推荐阅读
- c# - What EventType should I set for each of the 3 Handles.CircleHandleCap?
- r - R - Multiple Columns on one single Scatterplot
- bash - Bash input "read" stays open after Ctrl+C
- html - How to make this specific shadow for a box : before?
- c++ - Error handling. Mapping system error codes to generic
- python - Creating a list of random numbers without duplicates in python
- logic - 时钟“数据触发器”(DFF)实现
- metadata - Not be able to console log Auth0 user_metadata. I created a custom rule I also see the data in postman.What am I doing wrong
- python - XGBoost feature_importances_ parameter returns nan
- javascript - 如何使用反向浮动和溢出呈现内联列表