【发布时间】:2011-12-11 21:04:28
【问题描述】:
我对 Java 的类和接口语义比对 Actionscript 语义更熟悉,但是我有一些代码在 Java 中工作但在 Actionscript 中不工作的示例。这种差异是一个严重的问题,因为我试图从 Java DTO 编写代码生成我的 Actionscript 值对象,除非语义相同,否则我遇到了很大的麻烦。
这是在 Java 中工作但在 Actionscript 中编译失败的代码:
接口A:
public interface Ia {
function makeCopy():Ia;
}
接口 B:
public interface Ib extends Ia {
}
B 类(不会编译):
public class B implements Ib {
public function makeCopy():Ib {
return null;
}
}
我不明白为什么当接口 B 明显扩展接口 A 时,B 类会引发关于“makeCopy”签名不兼容的编译错误......因此没有违反类型或不兼容。如果这只是 Actionscript 的限制,有人可以提出重新编码的方法吗?
注意:我已经尝试将接口 B 更改为此,它在接口 B 中引发错误(在 Java 中工作):
public interface Ib extends Ia {
function makeCopy():Ib;
}
【问题讨论】:
-
我已经很久没有玩 Java 了,但不知何故我怀疑这在 Java 中也行得通。
-
如果您不打算遵循界面,那么界面的意义何在?
-
我正在关注它。 Ib 比 Ia 更具体,因此是兼容的。这就是为什么这段代码可以在 Java 中编译和工作的原因。任何实现 Ib 的东西都会实现 Ia。
-
这在 Java 中真的有效吗?
-
是的!事实上,它是双向的……类 B 用更具体的返回类型覆盖方法,而接口 Ib 用更具体的返回类型覆盖方法。它之所以有效,是因为 Ia 的合同得到维护。例如,如果我将 Ib 或 B 类中的覆盖方法的返回类型更改为“int”,它会引发错误,但由于 Ib“IS A”Ia,它不会正确。
标签: java actionscript-3 class inheritance interface