我正在寻找一些如下所示的代码:
public class Parent<T is_or_extends Parent<T>> {
public T function() {
// do some stuff //
return correct();
}
public T correct() {
return (T) this;
}
}
这样任何子类都可以访问其他父函数,但仍然是独立的类(没有将function()的返回值向上转换为Parent的实例)。 程序员也可以独立使用Parent类(因此可以创建Parent的实例而不使用function()向下转换返回对象)
实现:
public class Child extends Parent<Child> {}
用法:
Child child = new Child(); // ok
Parent<Child> polymorph = new Child(); // ok
Parent<Parent> parent = new Parent<Parent>(); // ERROR!
为了概述差异,这不是方法链的问题。相反,当父类接受子类的泛型时,它不能再单独用作类(使用上面的代码),因为new Parent<Parent>()
将不会编译(当替换“{{1 “with”is_or_extends
“)
我的目标:
我的目标是实现一个父类,当扩展时,extends
将返回子类的对象而不是父类。
我会使用泛型类型来告诉父类哪个子类调用了该函数,但是我不能再使用父类的对象而不会遇到异常。一个例子如下:
function()
提前致谢。
答案 0 :(得分:5)
extends
表示&#34;是或延伸&#34;。你的例子没有编译的原因是因为内部Parent
是一个原始类型,它不是T extends Parent<T>
的有效替代品。 &#34;正确&#34;类型如下所示:Parent<Parent<Parent<...>>>
ad infinitum。显然这种类型是不可能宣布的。
一种解决方案是将其实例化为:
Parent<?> parent = new Parent<>();
Parent<?> derived = parent.function();
这是有效的,因为编译器已经知道T
是Parent<?>
的某个子类。这个技巧的一个缺点是,如果无法推断出类型,例如使用匿名类时,它就无法工作。
另一种可能的方法 - 取决于父/子关系的性质 - 是创建一个额外的类来扩展基础,只是为了它的类型解析:
// Parent functionality in here
public static abstract class Base<T extends Base<T>> {}
// This can be empty, or have just constructors if necessary
public static class Simple extends Base<Parent> {}
// Child functionality in here
public static class Extended extends Base<Extended> {}