【发布时间】:2018-08-07 03:13:18
【问题描述】:
所以我不知道这是否可能我已经尝试过搜索,但可能我的搜索词已关闭。基本上我想知道,有没有办法在返回向下转换对象的超类中创建通用函数/方法。
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 树和/或添加“名称”的扩展类" 和 "属性" 或类似 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();
}
【问题讨论】:
-
我无法理解,你的最终目标是什么。
-
@NareshJoshi 最终目标是创建可以被许多不同子类继承的代码,同时为继承类提供看似一流的方法。该问题给出了其中一些示例。
标签: java generics inheritance polymorphism downcast