Я пытаюсь реализовать черту, которая заставляет каждый класс, который ее расширяет (и не является абстрактным), реализовывать определенные методы (даже если они уже существуют в суперклассах). Конкретно это должно выглядеть так:
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)
}
}
Приведенный выше код в идеале не должен компилироваться (поскольку отлаживаемый класс не реализует необходимые методы). На самом деле это не только компилирует, но и не выдает исключение времени выполнения (оно просто использует реализации класса объекта по умолчанию).
До сих пор ничего не удавалось создать ожидаемое поведение. Я думаю, что макросы могут помочь, но я не уверен, могут ли макросы express что-то вроде:
foreach class
if class.traits.contains(debugable)
return class.methods.contains(toString)
Я знаю, что мог бы позволить некоторому внешнему сценарию выполнить проверку и связать его с задачей компиляции gradle, но я надеюсь на решение, которое может быть реализовано как часть самого проекта (поскольку это сделало бы его независимым от используемого конвейера сборки, и поскольку оно должно быть проще и проще в обслуживании / расширении, чем написание сценария, сканирующего весь исходный код )