为什么可以通过Java中的引用来比较不兼容的类型?

Mik*_*kis 6 java comparison types pointers

看看这个片段:

    List<Integer> c = new ArrayList<>();
    Map<String,Boolean> m = new HashMap<>();
    if( c == m ) //no error here!  WHY?
    {
        c = m; //"Incompatible types" error, as expected.
        m = c; //"Incompatible types" error, as expected.
    }
Run Code Online (Sandbox Code Playgroud)

怎么来c == m没有错误?

我正在使用jdk1.8.0.20的javac,我没有理由怀疑它忽略了java语言规范,所以这在规范中具有相当绝对的确定性,因此:

规范允许这样的东西有什么意义/目的/用处?

Rad*_*def 2

这是特别允许的,因为ListMap是接口。

我们可以想象一些课程

// (please only imagine)
class ListMap implements List, Map {...}
Run Code Online (Sandbox Code Playgroud)

引用相等(15.21.3 )的编译时合法性与引用类型转换( 5.5.1 )相同。简而言之,由于您通常可以在任何引用类型和接口之间进行转换,因此您通常也可以将任何类型与接口的引用相等性进行比较。

Comparable在较小的接口(如、Serializable、等)的上下文中,该权限似乎更有用Iterable,其中一个类更有可能实现多个接口。