java - 如何在 java 中使用接受扩展接口类型的参数的函数创建接口?
问题描述
如何在 java 中使用接受扩展接口类型的参数的函数创建接口?
以接口 ISelfComparable 为例
如果 A 类扩展它,那么我希望它能够实现
bool compareTo(A other)
但如果 B 类扩展它,那么我希望它能够实现
bool compareTo(B other)
我知道我可以使用通用接口,但它似乎不正确,因为 A 扩展 ISelfComparable<B> 没有任何意义
如果这是不可能的,那么在这种情况下最好的做法是什么?
解决方案
通常的解决方案是自界泛型,如在Enum
课堂上所见。
interface Example<T extends Example<T>> {
void foo(T t);
}
public class ExampleImpl implements Example<ExampleImpl> {
@Override
public void foo(ExampleImpl example) {
}
}
它的工作原理有点令人眼花缭乱,但例如在这里解释得很好。这里也有关于这个主题的非常好的答案。
请注意,它并非万无一失,因为它允许这样做:
public class ExampleImpl2 extends Example<ExampleImpl {
@Override
public void foo(ExampleImpl example) {
}
}
但在实践中,自界成语用于准确表达您所追求的东西。
如果您真的,真的,真的需要参数对象总是与 完全相同的类this
,您必须进行运行时检查。(它也提出了你为什么需要这个的问题,但这会让我们偏离主题。)
推荐阅读
- c - 如何将 uint8_t 数组从 C 发送到 GO
- php - 使用 Yii 命令缓存的 PHP 文件
- html - 无法弄清楚如何使用 Bootstrap 获得 3x4 网格
- c++ - 将正则表达式从 Python 移植到 C++:大括号表达式中的意外字符
- ios - Swift 4.2 如果让 Xcode 11.2 上的 CMTime 失败
- c# - ASP.NET Core 3.0 处理多对多关系记录的正确方法
- java - 来自 Logback 的电子邮件,其变量值从 App.propeties 文件中读取
- c# - 等效于 C# 的 simple-oauth2
- java - if条件怎么写
- java - 在 Kotlin 上获取 Hashmap 项,但在 Java 上获取 Hashmap