【发布时间】:2020-02-26 08:53:43
【问题描述】:
我正在尝试实现一个特征,它强制每个扩展它的类(并且不是抽象的)实现某些方法(即使它们已经存在于超类中)。具体应该是这样的:
trait Debugable {
override def hashCode(): Int = ???
override def equals(obj: Any): Boolean = ???
override def toString: String = ???
}
这就是特征,这就是实现:
class TestClass {
}
object TestClass{
def main(args: Array[String]): Unit = {
val t = new TestClass
println(t)
}
}
上面的代码最好不要编译(因为可调试的类没有实现所需的方法)。实际上,这不仅可以编译,而且不会引发运行时异常(它只是采用对象类的默认实现)。
到目前为止,没有任何东西能够产生预期的行为。我认为宏可以提供帮助,但我不确定宏是否可以表达如下内容:
foreach class
if class.traits.contains(debugable)
return class.methods.contains(toString)
我知道我可以让一些外部脚本进行检查并将其与 gradle 编译任务捆绑在一起,但我希望有一个可以作为项目本身的一部分实施的解决方案(因为这将使它独立于使用的构建管道,因为它应该比编写爬取整个源代码的脚本更简单、更容易维护/扩展)
【问题讨论】:
标签: scala macros traits static-analysis