首页 > 解决方案 > 有没有办法模板抽象方法,以便抽象方法的参数的类型与实现子类相同?

问题描述

有没有办法模板抽象方法,以便抽象方法的参数的类型与实现子类相同?换句话说,如果我们有:

class Super {
    abstract void a_method( <Sub> param );
}

class Sub_A extends Super {
    void a_method( Sub_A param ){
        ...
    }

class Sub_B extends Super {
    void a_method( Sub_B param ){
        ...
    }
}

然后每个子类将自己的类型作为该方法的参数。我想避免使用接口或反射。

标签: javaparameter-passingabstract-class

解决方案


正常的做法是引入一个泛型参数:

abstract class Super<Sub extends Super> {
    abstract void a_method(Sub param);
}

class Sub_A extends Super<Sub_A> {
    void a_method(Sub_A param) {

    }
}

class Sub_B extends Super<Sub_B> {
    void a_method(Sub_B param) {

    }
}

据我所知,您不能强制子类将自己传递为T,例如可以定义class Sub_C extends Super<Sub_A>。不确定这是否有问题。


遵循 java 命名约定,它应该如下所示:

abstract class Super<S extends Super> {
    abstract void aMethod(S param);
}

class SubA extends Super<SubA> {
    void aMethod(SubA param) {

    }
}

class SubB extends Super<SubB> {
    void aMethod(SubB param) {

    }
}

推荐阅读