为什么我在向TreeSet添加元素时没有得到类转换异常或其他东西

Kru*_*hna 10 java collections

以下是我的代码

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)

然后你会得到一个编译时错误.