我有这门课:
public abstract class Addressable {
abstract <T extends "this" Addressable> void hardEquals(T t);
}
Run Code Online (Sandbox Code Playgroud)
方法hardEquals(T t)不是我想要的.我想要的是将T绑定为同一类this.换句话说,当我Addressable使用具体类扩展类时MyAddressable,我希望该方法hardEquals()具有签名:
void hardEquals(MyAddressable t);
Run Code Online (Sandbox Code Playgroud)
为了完整性:
public class MyAddressable extends Addressable {
void hardEquals(MyAddressable t);
}
Run Code Online (Sandbox Code Playgroud)
一般来说,\xe2\x80\x99 是不可能的。当仔细思考你的场景时,问题就会变得清晰。您拥有该类Addressable及其方法hardEquals,要求其参数的类型等于此。然后你就有了子类
public class MyAddressable extends Addressable {\n void hardEquals(MyAddressable t);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这似乎按预期工作。现在想象一下子类的子类:
\n\npublic class GrandChild extends MyAddressable {\n void hardEquals(MyAddressable t);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在这里,您有一个必须接受\xe2\x80\x99MyAddressable参数的类hardEquals,因为不允许通过缩小参数类型来覆盖方法,即不接受超类接受的内容。毕竟,您始终可以拥有一个MyAddressable实际引用 的实例的类型变量GrandChild。不可能限制参数以hardEquals匹配对象的实际运行时类型。
因此,所需的 \xe2\x80\x9c 参数类型必须与thistype\xe2\x80\x9d 规则相匹配,与 \xe2\x80\x9c 子类方法必须接受超类的所有参数 \xe2\x80\x9d 规则相冲突。
请注意,这通常与类型系统的实际限制相混淆,即相同的东西不适用于返回类型。由于允许缩小子类的返回类型,因此在某些情况下保证返回类型的愿望this可能是合理的,例如:
class Base {\n Base/*actually this type*/ clone() { \xe2\x80\xa6 }\n}\nclass SubClass extends Base {\n SubClass/*actually this type*/ clone() { \xe2\x80\xa6 }\n}\nclass GrandChild extends SubClass {\n GrandChild/*actually this type*/ clone() { \xe2\x80\xa6 }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n有效,但没有正式的方法来指定this返回类型的保证,因此\xe2\x80\x99s取决于程序员\xe2\x80\x99s的纪律,以将正确的覆盖添加到每个子类。
但是,如前所述,对于参数类型,这通常不起作用,因为您可以缩小子类中参数的类型。
\n| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |