interface と型チェックの有無
ふむ。おっしゃるとおり。
例えば次の例では、class Aを定義するときに、必ずm1()を実装しなければならないことが強制されます。これは型に関係ないですよね。
interface X { public void m1(); } class A implements X { public void m1() { System.out.println("foobar"); } }class Aがm1()を実装しているかどうかはコンパイル時にチェックできますが、これは型チェックのない言語でもできるはずです(実際の言語がしてるかどうかはともかく)。
そういうのも含めて型システムというのだと思うけど、とりあえず PHP は interface で宣言されたメソッドが実装されているかチェックしますね。
<? interface X { public function m1(); } class A implements X { public function m1() { } } ?>
m1 を実装しないと Fatal error になる。
あと、なんのためにメソッドの実装を強制するのかって、それはインターフェースに互換性の無い型をサブタイプと宣言できないからといった話もありますが。
前に書いた通りですね。型チェックのあるなしで「違う」と見なすのであれば、静的な言語と動的な言語ではそもそも機能の比較ができないでしょう(どうせ全て「違う」と見なされるのだから)。
基本的にみずしまさんのコメントにつきるんだけど、なんとために「視点による」と書いたのか分かってもらえてないようで。普通、比較するときは複数の面について比較するでしょ。ある面について違うから比較できないなんて話にはならないよ。
そういうわけで、Java の interface が静的型付けのための仕組みととらえると、静的な型チェックの有無は本質的な部分でしょ、というのが私の主張。みずしまさんも同じじゃないかなぁ。