有没有办法将 return 当前 class 键入最终方法?

Is there a way to return current class type in a final method?

我在java中有以下情况;有一个 class 实现了一个最终方法,但我需要这种方法的 returning 类型与它调用它的 class 类型完全相同。因为我希望方法是最终的,所以我不能修改 subclasses 中的 return 数据类型,因为那是非法的。

有没有一种方法可以在不牺牲最终性并且必须为所有实现它的子class重写这种方法的情况下将其存档?。即使该方法不是最终的,以这种方式实现它仍然会更快。

代码应该是这样的:

class Parent
{
    public currentClass finalMethod() {...}
}

class Children extends Parent {}

public static void main(String args[])
{
    Children c = new Children();
    System.out.print(c.finalMethod().getClass().getName()); // Would print Children
}

尝试使用反射和泛型无济于事。示例:

class Parent
{
    public this.getClass() finalMethod() {...} //Many Errors
    public <extends Parent> finalMethod() {...} // Returns Parent even if called by Child
    public Class<? extends Parent>[] getVecinos() // Returns Class<? extends Parent> thus can't use polymorphism which is the use case
}

我知道我可以使用转换,但仍然不是最佳解决方案。

默认行为是您将获得所需的内容,只要finalMethod不使用其他类型生成新实例。

要使用您的代码:

class Parent {
    public final Parent finalMethod() {
        return this;
    }
}

这样,c.finalMethod().getClass().getName() returns Children。这是因为 finalMethod() 中的 this 是使用 new Children() 创建的同一对象,并且 getClass() return 是对象的运行时 class。

它使用继承,只要您可以使用 Parent 作为 return 类型,就应该没问题。但是,如果您的 objective 是在 finalMethod() 的 return 值上调用特定于 Children 的方法,您可能需要使 Parent 通用。像这样:

class Parent<C extends Parent<C>> {
    public final Parent<C> finalMethod() {
        //whatever
        return this;
    }
}
class Children extends Parent<Children> {
}

这将使以下代码有效,仍然产生相同的输出:

Parent<Children> c = new Children(); //or Children c = new Children();
System.out.print(c.finalMethod().getClass().getName());

这样做的好处是您可以静态引用 Child 特定的方法,而无需事先强制转换。但这不是正确的解决方案,除非可以使 Parent 通用。它也不是 fail-safe.