所以我不知道这是否可能我尝试过搜索它,但也许我的搜索字词已关闭。基本上我想知道,有没有办法在超类中创建一个返回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();
}
答案 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> { }
现在T
是B
的子类,由于test()
的返回类型为T
,它将返回B
个实例。进一步的子类化可以用同样的方式完成:
class C<T extends C<?>> extends B<T> { }
这样的陈述可行:
C<?> c = new C<>().test();