我的问题就是要学着理解jls。我相信jls里的一切都是真的。
考虑jls的下一个片段:
8.4.8.1.重写(通过实例方法) 在类C中声明的实例方法m1覆盖在A类iff中声明的另一个实例方法m2,以下所有内容都是正确的: C是A的一个子类。 m1的签名是m2签名的一个子签名(§8.4.2)。 以下任一项: m2是公共的、受保护的或声明的,在与C相同的包中具有默认访问权限,或 m1重写方法m3 (与m1不同的m3,与m2不同的m3 ),因此m3重写m2。 此外,如果m1不是抽象的,那么m1将实现它覆盖的抽象方法的任何和所有声明。
转到子签名声明:
方法m1的签名是方法m2签名的子签名,条件是: m2具有与m1相同的签名,或 m1的签名与m2签名的擦除(§4.6)相同。
关于同样的签名:
如果两个方法的名称和参数类型相同,则它们具有相同的签名。
哪个规则允许使用协变量返回类型?
发布于 2014-05-12 20:36:41
这两个规则都不允许协变量返回类型。方法的签名引用方法名称及其参数的类型和顺序,但不引用返回类型。
来自JLS,第8.4.8.3节
如果返回类型为d1的方法声明R1覆盖或隐藏了具有返回类型R2的另一个方法d2的声明,那么d1必须是d2的返回类型替代(§8.4.5),否则就会发生编译时错误。 此规则允许协变量返回类型--在重写方法时细化其返回类型。
这指的是第8.4.5节,它指出:
返回类型为d1的方法声明R1是返回类型R2的另一个方法d2的返回类型替代,当且仅当以下任何一项都是正确的:
- R1, adapted to the type parameters of d2 (§8.4.4), **is a subtype of R2**.- R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9).- d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.(强调地雷)
第一部分粗体允许协变量返回类型。
https://stackoverflow.com/questions/23618298
复制相似问题