【发布时间】:2014-05-11 14:42:41
【问题描述】:
我正在阅读 jls 并且遇到以下术语:
return-type-substitutable
来自 jls 的 sn-p
返回类型为 R1 的方法声明 d1 是 返回类型可替代具有返回类型 R2 的另一种方法 d2 如果以下任何一项为真:
如果 R1 无效,则 R2 无效。
如果 R1 是原始类型,则 R2 与 R1 相同。
如果 R1 是引用类型,则以下情况之一为真:
--R1,适应于d2的类型参数(§8.4.4),是一个子类型 R2。
--R1 可以通过未经检查的转换转换为 R2 的子类型 (§5.1.9)。
--d1 与 d2 (§8.4.2) 没有相同的签名,并且 R1 = |R2|。
前两点很清楚。
你能说清楚吗
--R1,适配d2的类型参数(§8.4.4),是R2的子类型。
--R1 可以通过未经检查的转换(第 5.1.9 节)转换为 R2 的子类型。
--d1 与 d2 (§8.4.2) 没有相同的签名,并且 R1 = |R2|。
谢谢
附: 路易吉·门多萨
interface Foo {
List<String> foo(String arg1, String arg2);
}
class Bar implements Foo {
@Override
public ArrayList<String> foo(String arg1, String arg2) {
//implementation...
return null;
}
public String foo(String arg1, String arg2, String arg3) {
//implementation...
return null;
}
}
它是工作变体。
我的问题的原因 - 我想了解 jls 中的以下短语:
如果返回类型为 R1 的方法声明 d1 覆盖或隐藏 用返回类型 R2 声明另一个方法 d2,那么 d1 必须是 d2 的返回类型可替换(第 8.4.5 节)或编译时错误 发生
规则:
If R1 is a reference type then **one of the following** is true:
...
--d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.
...
代码:
interface Foo {
List<String> foo(String arg1, String arg2);
}
class Bar implements Foo {
@Override
public List<String> anotherName(String arg1, String arg2,Object obj) {
return null;
}
这是编译错误。
R1==R2 (List<String > == List<String>)
d1!=d2
我在哪里违反了规则?
【问题讨论】:
-
从您上次的编辑开始,没有
anotherName方法可以覆盖,因此您会收到编译器错误。此外,您说Bar实现了Foo,但Bar类中没有public List<String> foo(String arg1, String arg2)方法(或另一个签名foo(String arg1, String arg2)的方法返回List或List的子类型)。跨度> -
@Luiggi Mendoza 我写了规则,并根据我对这条规则的看法编写了代码示例。你能指定我违反规则的地方吗?
-
我已经在我的评论中指出了它们。
-
@Luiggi Mendoza 您的评论很常见。我接受了。但这是你的java可以理解的。想象一下,您是 Java 新手并试图遵守规则。请使用以下格式添加到您的问题更新中:引用规则 - 我的代码中的违规。
-
我说的是 2 条规则:1。 如果具有返回类型 R1 的方法声明 d1 覆盖或隐藏具有返回类型 R2 的另一个方法 d2 的声明,则 d1 必须是 d2 的返回类型可替换(第 8.4.5 节),否则会出现编译时错误发生为 d2(第 8.4.2 节),并且 R1 = |R2|
标签: java inheritance methods return jls