为什么这样:
import java.util.*;
public class my {
public static void main(String[] a) {
TreeMap<TreeSet<Integer>, String> map = new TreeMap<TreeSet<Integer>, String>();
TreeSet<Integer> set = new TreeSet<Integer>();
map.put(set, "lol");
}
}
在Java 6工作?我的意思是通过规范将TreeSet作为TreeMap的键而不使用适当的Comparator应该导致ClassCastException,但它在Java 6下运行时不会。它是一个bug还是Java 7中的一些规范更改使其正常工作(即抛出ClassCastException)?
这在Java 7中也是允许的,而不仅仅是Java 6。
如果密钥不是实现put
的类型,则ClassCastException
方法将抛出Comparable
。该类可能被设计为在构造函数中抛出异常,但它不是因为
(a)泛型参数类型受到类型擦除,因此实际的TreeMap
将所有内容视为普通对象,并且不能在构造函数中应用任何检查;
(b)这种方式允许您使用任何对象作为键,只要它是实现Comparable
的子类,即使您最初没有声明TreeMap
采用类似的键类型。