java - 为什么用通配符创建的比较器的比较方法不能接受对象?
问题描述
在 Java 中,像这样创建比较器对象是合法的:
Comparator<? super Number> comparator = new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
// implementation here
}
};
但是您不能将此对象用于这样的简单调用:
Object o1 = new Object(), o2 = new Object();
comparator.compare(o1, o2);
为什么这样?我认为? super Number
是指 Number 及其所有超类。
解决方案
假设您使用的是? super Double
:
Comparator<? super Double> comparator = new Comparator<Object>() {
// ...
};
你告诉编译器的是你有一个比较器
- 可能是,
Comparator<Double>
或 - 可能是,
Comparator<Number>
或 - 可能是,
Comparator<Object>
或 - 可能是一个
Comparator<Serializable>
.
即使您使用 a 对其进行了初始化Comparator<Object>
,编译器也不知道这一点,因为编译器不执行代码。编译器只知道该变量包含上述类型之一的 Comparator。
由于变量可能包含比 Object 类型更具体的比较器,因此编译器不会假定可以传递 Object。
推荐阅读
- ios - 呈现新 UINavigationController 时出现问题:在 StatusBar 下
- spring - Sprint 启动错误无法获取条目 BOOT-INF/lib/lucene-analyzers-common-7.1.0.jar 的嵌套存档
- vba - 为什么我无法使用 excel VBA 更新 Listbox 的 RowSource 属性?
- javascript - 在JS函数中传递css文件的路径
- java - 无法从单个图像opencv(Java)保存多个图像
- python - Python程序需要更新版本的libX11
- php - 简单的 HTML DOM Parser 通过网站登录抓取数据
- php - cakephp中webroot文件夹的URL重定向
- java - Kotlin ClassNotFoundException:com.android.org.conscrypt.OpenSSLRSAPublicKey
- vifm - Vifm 启动:如何让 vifm 记住启动时的最后一个光标/选择器位置?