java - 有没有办法模板抽象方法,以便抽象方法的参数的类型与实现子类相同?
问题描述
有没有办法模板抽象方法,以便抽象方法的参数的类型与实现子类相同?换句话说,如果我们有:
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 ){
...
}
}
然后每个子类将自己的类型作为该方法的参数。我想避免使用接口或反射。
解决方案
正常的做法是引入一个泛型参数:
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) {
}
}
推荐阅读
- excel - 如何连接多个满足表格/Excel 标准的单元格?
- amazon-web-services - 通过 Athena 和/或 Glue 将 S3 数据 ETLing 到 CSV
- javascript - 花括号外的展开运算符有什么作用?
- python-3.x - 优化组合的组合
- laravel - 雄辩地将 json 数组更新为字符串转换失败,但使用 save() 有效
- django - Django STATIC_URL 请求
- python - 使用按键重新启动 While 循环
- rust - Rust std 库中的所有宏都包含在前奏中吗?
- codenameone - 排除未使用的 .class 文件
- asp.net-core - ASP.NET Core 如何根据布尔值将用户重定向到页面