我正在尝试构建一个Scala应用程序,用户可以在其中加载实现由特征定义的接口的类,然后应用程序将使用该特性。
例如,我的操作员特质
trait Operator {
def operate(a: Int, b: Int): Int
}
由要在运行时加载的用户定义类实现,添加。
class Add {
def operate(a: Int, b: Int): Int = a + b
}
应用程序如何检查此Add类是否实现了它所知道的运算符特征?我希望能够在加载的类的实例上调用operate
。
我尝试过像这样的简单模式匹配
case op: Class[Operator] => op.newInstance()
但这似乎是基于特征名称而不是成员签名来检查实现。
答案 0 :(得分:3)
首先,请清除术语,class
Add
根本没有implement
您定义的Operator
特征。您不应该也不能使用明确定义的术语来表示与其实际含义相比的不同内容。
现在,您要找的是structural types
而不是traits
。
让我们定义一个名为strucural type
的{{1}},
IsOperator
让我们定义一些使用它的逻辑,
type IsOperator = {
def operate(a: Int, b: Int): Int
}
现在,任何def perform(a: Int, b: Int, o: IsOperator): Int = o.operate(a, b)
或任何object
的实例都会向class
structural type
确认(有一个名为IsOperate
的方法,其类型为operate
})可以与(Int, Int) => Int
一起使用。
perform