Вопрос по кастингу интерфейсов.
*******************************************************************************/

interface Dancer {
    //void dance(){
    //    System.out.println("DANCER");
    //}
    void dance();
}

interface SubDancer extends Dancer {
    void dance();
}

public class Main
{
	public static void main(String[] args) {
	    SubDancer sub = //()->System.out.println("Hello World");
	    new SubDancer() {
	        public void dance(){
	            System.out.println("Hello World");
	        }
	    };
	    sub.dance();
	    ((Dancer)sub).dance();
	}
}
Не могу понять, почему при кастинге интерфейса возвращается одно и то же значение. Так же как и не могу понять, почему будет возвращаться значение из потомка, если в родителе объявлен тот же метод по дефолту, т.е. вот так:
interface Dancer {
    default void dance(){
      System.out.println("DANCER");
    }
}
Почему все равно возвращается «Hello World»?