以下是我的代码
class NumberComparator<Number> implements Comparator<Number> {
public int compare(Number o1, Number o2) {
return 1;
}
}
public class Ex28 {
public static void main(String[] args) {
TreeSet set = new TreeSet(new NumberComparator<Number>());
set.add(1);
set.add(1.4f);
set.add(1L);
set.add("1a");
System.out.println(set);
}
}
Run Code Online (Sandbox Code Playgroud)
因为我已经定义了我自己的Number类型的比较器,但是当我添加任何其他字符串的东西时,它并没有给我任何异常.它只是工作正常.我得到了输出
[1, 1.4, 1, 1a]
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释它为什么会发生.
Jon*_*eet 17
问题是一些不良做法的混合:
TreeSet
NumberComparator
是通用的(Number
是一个类型参数)Number
这里的类型参数这一事实意味着类型擦除意味着您实际上不会转换为实际Number
类型.
如果将比较器更改为:
class NumberComparator implements Comparator<Number> {
public int compare(Number o1, Number o2) {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
和你的调用代码:
TreeSet set = new TreeSet(new NumberComparator());
Run Code Online (Sandbox Code Playgroud)
然后我会期待一个例外.
此外,如果您将代码更改为不使用原始类型:
TreeSet<Number> set = new TreeSet<Number>(new NumberComparator());
Run Code Online (Sandbox Code Playgroud)
然后你会得到一个编译时错误.
归档时间: |
|
查看次数: |
577 次 |
最近记录: |