为什么TreeSet可以在jdk 1.6中用作TreeMap的键?

问题描述 投票:1回答:1

为什么这样:

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 classcastexception java-6
1个回答
0
投票

这在Java 7中也是允许的,而不仅仅是Java 6。

如果密钥不是实现put的类型,则ClassCastException方法将抛出Comparable。该类可能被设计为在构造函数中抛出异常,但它不是因为 (a)泛型参数类型受到类型擦除,因此实际的TreeMap将所有内容视为普通对象,并且不能在构造函数中应用任何检查;

(b)这种方式允许您使用任何对象作为键,只要它是实现Comparable的子类,即使您最初没有声明TreeMap采用类似的键类型。

© www.soinside.com 2019 - 2024. All rights reserved.