実行前にエラーにわかるようにするためには、
コード上に論理的な制約を書けばいい。

このクラスは必ず○というインターフェースを実装している。
この変数には○というインターフェースを持っているものしか代入できない。

通常これらは宣言などというが、
見方を変えれば、論理的制約でもある。

コード上にコンパイラが理解できる形で制約を書いておくことで
実行前に解るようになる。

当然何も情報がない所から、実行前に解るようになるわけではない。成約情報を入れるのは人間。
そして静的に判定可能な形で制約情報を入れられる構文を持っているのが静的言語。