У меня есть базовый класс, который исходит из библиотеки Java, код которой я не могу изменить. Этот класс (А) имеет пустой метод (б), который должен был быть объявлен как абстрактный вместо:Реализация абстрактного метода с признаком, непоследовательное поведение компилятора?
class A {
def b { }
}
Я продлить этот класс в Scala и переопределить метод, чтобы сделать его аннотация:
abstract class AA extends A {
override def b
}
Теперь я реализовать этот метод в черте:
trait B {
def b { println("B") }
}
Если я расширяю АА с чертом B, я получаю сообщение об ошибке: первостепенный метод б в классе А типа => единицы; метод б в черте B типа => необходим блок `переопределение модификатор:
class C extends AA with B {}
Вместо этого, если код был, как это, все компилируется без ошибок, который, кажется, немного противоречивым мне:
abstract class AA {
def b
}
trait B {
def b { println("B") }
}
class C extends AA with B {}
Я запускаю Scala 2.8.0RC3 и совершенно новый для языка (3 дня). Еще одна странного и связанное с поведением является то, что метка переопределения не является необходимой при проведении б аннотации:
abstract class AA extends A {
def b
}
Является ли такая же проблема, как если бы вы хотели заменить реализацию Java toString класса Java, смешав свою собственную реализацию 'def toString(): String', которую вы определили бы в черте? – huynhjl
Нет, это не тот случай. В этом случае поведение компилятора делает общий смысл, потому что неоднозначно, какое определение должно использоваться: Java toString или mixin one. В моем случае есть только один доступный. –