如何绑定子类的类类型

opt*_*enk 9 java generics

我有这门课:

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)
  1. 有可能实现我想要的吗?
  2. 如果答案是否定的,我的班级约束是否如此愚蠢?

Hol*_*ger 3

一般来说,\xe2\x80\x99 是不可能的。当仔细思考你的场景时,问题就会变得清晰。您拥有该类Addressable及其方法hardEquals,要求其参数的类型等于此。然后你就有了子类

\n\n
public class MyAddressable extends Addressable {\n  void hardEquals(MyAddressable t);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这似乎按预期工作。现在想象一下子类的子类:

\n\n
public class GrandChild extends MyAddressable {\n  void hardEquals(MyAddressable t);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,您有一个必须接受\xe2\x80\x99MyAddressable参数的类hardEquals,因为不允许通过缩小参数类型来覆盖方法,即不接受超类接受的内容。毕竟,您始终可以拥有一个MyAddressable实际引用 的实例的类型变量GrandChild。不可能限制参数以hardEquals匹配对象的实际运行时类型。

\n\n

因此,所需的 \xe2\x80\x9c 参数类型必须与thistype\xe2\x80\x9d 规则相匹配,与 \xe2\x80\x9c 子类方法必须接受超类的所有参数 \xe2\x80\x9d 规则相冲突。

\n\n
\n\n

请注意,这通常与类型系统的实际限制相混淆,即相同的东西不适用于返回类型。由于允许缩小子类的返回类型,因此在某些情况下保证返回类型的愿望this可能是合理的,例如:

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有效,但没有正式的方法来指定this返回类型的保证,因此\xe2\x80\x99s取决于程序员\xe2\x80\x99s的纪律,以将正确的覆盖添加到每个子类。

\n\n

但是,如前所述,对于参数类型,这通常不起作用,因为您可以缩小子类中参数的类型。

\n