代码之家  ›  专栏  ›  技术社区  ›  Leo Izen

数组的子类型

  •  -8
  • Leo Izen  · 技术社区  · 14 年前

    class A { class B extends A {

    B[] b = new B[1];
    b[0] = new B();
    System.out.println(b instanceof A[]);
    

    打印对还是错?

    4 回复  |  直到 10 年前
        1
  •  15
  •   Mark Peters    12 年前

    JLS states 如果B可分配给A,那么是的,B[]可分配给A[]。

    但是,这打开了一扇通往严重影响的大门,代码如下:

    class A {}
    class B extends A {}
    class C extends A {}
    
    //...
    B[] bs = new B[2];
    A[] as = bs;
    as[0] = new C(); //runtime error
    B b = bs[0];
    

    此代码 compiles but fails at runtime

        2
  •  1
  •   Rob Hruska MegalomanINA    14 年前
    // A.java
    public class A {}
    
    // B.java
    public class B extends A {}
    
    // Test.java
    public class Test {
        public static void main(String[] args) {
            B[] b = new B[1];
            b[0] = new B();
            System.out.println(b instanceof A[]);
        }
    }
    

    运行时:

    > javac *.java && java Test
    true
    
        3
  •  0
  •   Darin Dimitrov    14 年前

    true .

        4
  •  -4
  •   Darron    14 年前

    假的。

    数组与普通对象不遵循相同的规则。