Определите общий тип метода родительского класса в зависимости от типа подкласса в 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