Если у меня есть следующий класс Scala:
abstract class MyOrdered extends Ordered[MyOrdered] {
def id: Int
def compare(that : MyOrdered) : Int =
if (that==null) 1 else (id-that.id)
}
Тогда мне нужно только определить метод id в Scala, чтобы получить конкретный класс. Но если я попытаюсь расширить его на Java, компилятор говорит, что отсутствуют все конкретные методы Ordered. Значит ли это, что компилятор Scala выполняет только реализацию конкретных методов Ordered в конкретных классах Scala?
Это кажется очень расточительным, потому что я мог бы иметь десятки конкретных классов, реализующих MyOrdered, и все они получат копию того же кода, когда на самом деле этого достаточно, чтобы просто поместить его прямо в базовый класс MyOrdered. Кроме того, это очень затрудняет создание Java-дружественного API Scala. Есть ли способ заставить компилятор Scala поставить определения метода там, где он должен был это сделать, в любом случае, кроме создания конкретного класса с помощью реализации фиктивных методов?
Даже funnier объявляет конкретный метод final в признаке Scala. В этом случае он до сих пор не реализован в абстрактном классе Scala, который расширяет черту, но не может быть реализован в классе Java, который расширяет абстрактный класс Scala, поскольку он помечен как окончательный. Это определенно ошибка компилятора. Окончательные абстрактные методы не имеют смысла, даже если они являются законными в JVM, по-видимому.