Прежде всего, в вашем сценарии следующее совсем не является понижением, потому что в описанной иерархии B - это B, B - это A, а B - это InterfaceA. Таким образом, любое из этих приведений может быть опущено.
InterfaceA i = (InterfaceA)(A)(B) b;
Тогда, отвечая на ваш вопрос. Даункастинг будет компилироваться тогда и только тогда, когда это будет возможно во время выполнения. Давайте введем дополнительный класс D, который расширяет класс A и реализует InterfaceB1.
A a = new A();
InterfaceB1 b1 = (InterfaceB1) a; // compilable as A reference can contain object of class B that implements InterfaceB1
InterfaceB2 b2 = (InterfaceB2) a; // compilable as A reference can contain object of class B that implements InterfaceB2
b1 = (InterfaceB1) b2; // compilable as InterfaceB2 reference can contain object of class B that implements both InterfaceB1, InterfaceB2
B b = (B) a; // compilable as A reference can contain object of class B
C c = (C) a; // compilable as A reference can contain object of class C
D d = (D) a; // compilable as A reference can contain object of class D
d = (D) b1; // compilable as InterfaceB1 reference can contain object of class D in runtime
b = (B) d; // not compilable since D reference can NEVER contain object of class B in runtime
c = (C) d; // not compilable since D reference can NEVER contain object of class D in runtime
Что касается создания ClassCastException, оно всегда о том, что на самом деле содержится в ссылке на ваш объект.
A a1 = new A();
A a2 = new B();
InterfaceB1 b1 = (InterfaceB1) a1; // compiles but causes ClassCastException as A cannot be cast to InterfaceB1
InterfaceB1 b2 = (InterfaceB1) a2; // compiles and runs just normally as B can be cast to InterfaceB1