Java Inheritance Wrinkle

5 AM July 28, 2004

I discovered something about Java's type system today.

Suppose there are three Java classes, A, B and C. C extends B and B extends A. A is in package p1. B and C are in package p2. A and C are normal public classes, but B is package private. From package p3, can I see that C is a subclass of A?

In other words, given the following classes:


package p1;



public class A {

    public void sayHi() {

        System.out.println("hi");

    }

}


package p2;



class B extends p1.A {

}


package p2;



public class C extends B {

}

Will this code compile (and run)?


package p3;



public class Run {

    public static void main(String[] args) {

        p1.A c = new p2.C();

        c.sayHi();

    }

}

Answer in blue on blue text here: Yes, and I wonder what evil tricks I can pull in my public APIs as a result.

By alang | # | Comments (7)
(Posted to javablogs and Java)
© 2003-2006 Alan Green