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

时间:2015-11-10 15:52:37

标签: java-7 classcastexception java-6

为什么会这样:

        j = 0

    For i = 1 To 30

        With Sheets("Arbeiter-Tage")
            If Application.WorksheetFunction.CountA(.Columns(1)) <> 0 Then
                lastRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1
            Else
                lastRow = 1
            End If

            Sheets("Vorlage").Activate

            If ActiveSheet.Range("V" & 25 + j).Value = 0 Then

                ActiveSheet.Range("B" & 25 + j & ":" & "Q" & 25 + j).Copy

                .Range("A" & lastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            End If

        End With

    j = j + 2

在Java 6中工作?我的意思是,通过将TreeSet作为TreeMap的键而不使用适当的Comparator的规范应该导致ClassCastException,但是在Java 6下运行时它没有。这是一个错误还是Java 7中的一些规范更改使其正常工作(即抛出ClassCastException)?

1 个答案:

答案 0 :(得分:0)

Java 7中也允许这样做,而不仅仅是Java 6。

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

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