根据Java中的子类Type定义泛型类父类方法

时间:2014-01-05 12:32:01

标签: java generics subclassing

是否可以根据子类类型动态识别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 个答案:

答案 0 :(得分:4)

你想要这个:

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

答案 1 :(得分:0)

Parent在Java类型系统中不可能引用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