Определите общий тип метода родительского класса в зависимости от типа подкласса в Java
можно ли динамически идентифицировать T как тип возврата в зависимости от типа подкласса? Я хочу что-то вроде следующего:
public class Parent {
public <T extends Parent> T foo() {
return (T)this;
}
}
public class Child extends Parent {
public void childMethod() {
System.out.println("childMethod called");
}
}
а потом позвонить:
Child child = new Child();
child.foo().childMethod();
без определения типа так:
Child child = new Child();
child.foo().<Child>childMethod(); // compiles fine
спасибо заранее!
2 ответов
вы хотите это:
public class Parent<T extends Parent<T>> {
public T foo() {
return (T)this;
}
}
public class Child extends Parent<Child> {
public void childMethod() {
System.out.println("childMethod called");
}
}
Child child = new Child();
child.foo().childMethod(); // compiles
это невозможно в системе типов Java для Parent
для обозначения точного класса this
. Однако, он может иметь параметр типа (скажем T
), что подклассы могут указывать, как сами, так и какой-либо другой тип (все, что они хотят), и использовать абстрактный метод для делегирования задачи получения экземпляра этого типа T
для подкласса.
public abstract class Parent<T> {
// the implementer is responsible for how to get an instance of T
public abstract T getT();
// in this case, foo() is kind of redundant
public T foo() {
return getT();
}
}
public class Child extends Parent<Child> {
public Child getT() {
return this;
}
public void childMethod() {
System.out.println("childMethod called");
}
}
Child child = new Child();
child.foo().childMethod(); // compiles