java中的多态方法返回类型向下转换

时间:2018-02-27 12:55:47

标签: java generics inheritance polymorphism downcast

所以我不知道这是否可能我尝试过搜索它,但也许我的搜索字词已关闭。基本上我想知道,有没有办法在超类中创建一个返回downcast对象的泛型函数/方法。

class A {
    public <downcasted type (in this example B if called from a B instance)> test() {
        return this;
    }
}

class B extends A { }

B b = new B().test()

基本上有“test()”将B实例作为类型B返回,甚至知道函数/方法是纯粹在父类中声明的?

我知道我可以转换变量,因为有许多函数,其中一些函数可能会返回类类型的列表,等等变得麻烦。我也意识到我可以@override B中的函数并执行“return(B)this.super()”的事情,但是再次包装许多函数是单调乏味的,这使得更新基类代码更加痛苦。

我也知道你可以做到

"class A<T extends A>"

然后将B定义为

"class B extends A<B>"

但是如果你想制作一个延伸“B”的“C”,它会中断。

这种行为可能吗?如果是这样,它叫什么,我该如何实现呢?

这种行为可能有用的示例可能是您想要扩展的任何基础数据结构,如N-Ary树,您可以扩展为oct / quad树结构和/或扩展类,添加“名称” “和”属性“或类似xml节点的东西。

编辑: 这似乎是有效的(就linter而言),实现基本方法需要更多的工作,但就我所知,它已经得到了理想的最终结果。那说当我试图运行它时,它给了我一个“找不到符号:类类型”的错误。 :S

static class D extends auto {

    final Class type = getClass();

    @SuppressWarnings("unchecked")
    public <T extends type> T test() {
        return (T)type.cast(this);
    }
}

static class E extends D { }
static class F extends E { }

static {
    D d = new D().test();
    E e = new E().test();
    F f = new F().test();
}

1 个答案:

答案 0 :(得分:1)

更新

有一种更简单的方法,似乎有效:

class Alpha {

    @SuppressWarnings("unchecked")
    <T extends Alpha> T test() {
        return (T) this;
    }
}
class B extends A { }

但是,这不支持方法链接。

原帖

您需要test()返回A的子类型,而不是A本身。为了做到这一点,A类的签名可以是:

class A<T extends A<?>> {

    @SuppressWarnings("unchecked")
    public T test() {
        return (T) this;
    }
}

如果您创建的文章B延长A,则需要B.test()才能返回B的实例,而无需覆盖test()返回具体类型。然后你可以做这样的事情:

class B<T extends B<?>> extends A<T> { }

现在TB的子类,由于test()的返回类型为T,它将返回B个实例。进一步的子类化可以用同样的方式完成:

class C<T extends C<?>> extends B<T> { }

这样的陈述可行:

C<?> c = new C<>().test();