package cast_out; class Base {} class Derived extends Base {} interface I { public void foo(Derived d); } interface J extends Cloneable, I { } abstract class Goo implements Cloneable, J { public void foo(Base b) { System.out.println("base"); } } class Woo extends Goo { public void foo(Derived d) { System.out.println("derived"); } } public class TestHierarchyOverloadedMultiLevel { Base inlineMe() { return new Derived(); } void main() { Goo goo = new Woo(); goo.foo(/*]*/(Base) new Derived()/*[*/); } public static void main(String[] args) { new TestHierarchyOverloadedMultiLevel().main(); } }