У меня есть следующий код, частично на Java, частично на Scala:
Java:
public interface ISubject {
public void a()
//...
}
public class CSubject implements ISubject {
public void a() { /*...*/ }
public void b() { /*...*/ }
//...
}
public abstract class AbstractTest {
ISubject subject;
//...
public CSubject generateParticularSubject() {
return new CSubject();
}
}
Scala:
object Test extends AbstractTest {
override val subject: CSubject = generateParticularSubject() /*1*/
subject.b() /*2*/
}
Проблема: еслистрока с пометкой «1» такая же, как и в коде выше, компилятор жалуется, что overriding variable subject in class AbstractTest of type ISubject; value subject has incompatible type
.Если я удаляю тип annotaion : CSubject
в строке '1' и ключевые слова override val
, эта ошибка исчезает, но в строке '2' появляется другая: value b is not a member of ISubject
.
Я понимаю, что говорят эти ошибкии способ, которым компилятор думает, получая эти проблемы.Что я не понимаю, так это как получить поведение, такое же, как в Java, где при реализации члена интерфейса класса можно инициализировать его любым классом, реализующим интерфейс.Как это сделать в Scala?
ОБНОВЛЕНИЕ: Правда ли, что в Scala невозможно реализовать такую конструкцию?Причина, по которой я хочу это сделать, заключается в том, что AbstractTest
содержит методы, которые имеют дело с ISubject
стороной субъекта, и дочерние классы, которые должны переопределить subject
и определять его как более узкий экземпляр класса, должны реализовывать методы, специфичные для этого.учебный класс.В то же время я хочу, чтобы AbstractTest
продолжал обрабатывать все, что касается subject
, и может обрабатываться, пока он обрабатывается через интерфейс ISubject
.