【发布时间】:2012-02-08 11:49:26
【问题描述】:
我有以下代码,部分用 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();
}
}
斯卡拉:
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。如果我删除“1”行中的类型注释: CSubject 和关键字override val,该错误就会消失,但另一个错误会出现在“2”行:value b is not a member of ISubject。
我了解这些错误的含义以及编译器认为出现这些问题的方式。我不明白的是如何获得与 Java 中相同的行为,在实现类的接口成员的情况下,可以使用任何类型的实现接口的类对其进行初始化。在 Scala 中执行此操作的方法是什么?
更新:在 Scala 中不可能实现这样的构造是真的吗?我想这样做的原因是因为AbstractTest 包含处理主题的ISubject 侧的方法以及应该覆盖subject 并将其定义为更窄的类实例的子类,必须实现特定于该的方法班级。同时我希望AbstractTest 继续处理与subject 相关的所有事情,并且可以在通过其接口ISubject 处理时进行处理。
【问题讨论】:
标签: java scala inheritance interface overriding