Из JLS 5.5.1, приведение типа ссылки: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.5.1
При заданном типе ссылки времени компиляции S (источник) и типе ссылки времени компиляции T (цель), приведение типасуществует преобразование из S в T, если из-за следующих правил не возникает ошибок времени компиляции.
В нашем случае S = D (интерфейс), T = C (класс).
Если S является типом класса:
S - это интерфейс, поэтому мы пропускаем это.
Если S - это тип интерфейса:
D - это интерфейс, поэтому мы используем эту ветвь.
Если T является типом массива, то S должен иметь тип java.io.Serializable или Cloneable (единственные интерфейсы, реализуемые массивами), иначе возникает ошибка времени компиляции.
T не является типом массива, мы пропускаем это.
Если T является классом или интерфейсным типом, который не является окончательным (§8.1.1), то если существует супертип XT и супертип Y для S, такой, что X и Y являются доказуемо различными параметризованными типами и что стирание X и Y одинаково, возникает ошибка времени компиляции.
Мынет этого.Мы, конечно, можем создать его, чтобы это произошло, но для этого требуется переопределение C.
В противном случае приведение всегда допустимо во время компиляции (потому что даже если Tне реализует S, подкласс T может).
Другими словами, у компилятора нет причин выдавать ошибку, поскольку вполне возможно, что в другом месте существует возможный класскоторый может использоваться для квалификации приведения.
Например, вы могли бы иметь это в другом месте:
class E extends C implements D { ... }
Завершение C вызывает ошибку времени компиляции:
final class C { ... }
По существу, существует вероятность того, что существует реализация C, которая может работать во время выполнения, что невозможно проверить во время компиляции.