有没有一种方法可以对抽象方法进行模板化,以便抽象方法的参数与实现子类的类型相同?

时间:2019-12-01 16:05:16

标签: java parameter-passing abstract-class

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

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 ){
        ...
    }
}

然后,每个子类将其自身的类型用作此方法的参数。我想避免使用界面或反射。

2 个答案:

答案 0 :(得分:5)

通常的方法是引入一个通用参数:

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) {

    }
}

答案 1 :(得分:0)

This answer is correct。以防万一有人遇到这个问题,但是像我这样与科特林一起工作,这是要点

abstract class AbstractParam

abstract class AbstractClass<T: AbstractParam> {
    abstract fun f(p: T)
}

class Param: AbstractParam()

class Class: AbstractClass<Param>() {
    override fun f(p: Param) {}
}