首页 > Java > java教程 > 如何在 Java 中使用类型变量引用当前类型?

如何在 Java 中使用类型变量引用当前类型?

Mary-Kate Olsen
发布: 2024-12-18 08:02:10
原创
418 人浏览过

How Can I Refer to the Current Type with a Type Variable in Java?

有没有办法用类型变量来引用当前类型?

在Java中,无法直接用类型来引用当前类型多变的。当尝试编写可以返回当前类型实例的方法时,就会出现问题,这在处理子类型时会出现问题。例如,在基类中声明返回类型 T 的泛型方法将引用子类中的基类类型,而不是实际的子类类型。

利用递归边界和抽象类/接口的解决方法

为了解决这个问题,可以采用递归边界和抽象类层次结构,如下所示:

abstract class SelfTyped<SELF extends SelfTyped<SELF>> {
    abstract SELF self();
}

class MyBaseClass<SELF extends MyBaseClass<SELF>>
        extends SelfTyped<SELF> {

    MyBaseClass() { }

    public SELF baseMethod() {
        return self();
    }
}

final class MyLeafClass extends MyBaseClass<MyLeafClass> {

    @Override
    MyLeafClass self() {
        return this;
    }

    public MyLeafClass leafMethod() {
        return self();
    }
}
登录后复制

在通过这种方法,叶类将递归类型参数 SELF 解析为它们自己的类型并实现 self()。叶类可以直接使用,允许方法链接,同时保留正确的返回类型:

MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod();

AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
登录后复制

注意:这种技术依赖于奇怪的重复模板模式(CRT)并引入了一定的风险:

  • 类型替换漏洞:派生类可以覆盖SELF以返回不同的类型,损害 self 类型保证。
  • 不正确的 self() 实现: self() 的派生类实现可能无法准确返回当前实例。

为了减轻这些风险,请确保所涉及的类不可公开扩展,并考虑对 SelfTyped 和self().

评估和使用注意事项

虽然此解决方法提供了一种引用当前类型的方法,但它引入了额外的复杂性和限制。建议在实施之前仔细权衡其好处和潜在缺点。在显式类型引用至关重要的情况下,此解决方案可能很有用,但请避免过度依赖它或在公共 API 中。

以上是如何在 Java 中使用类型变量引用当前类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板