なぜこれがコンパイルされるのですか?(Oracle Java 5 と Java 6 の両方で試してみました (はい、わかっています。適応が遅いです)
public abstract class BaseClass
{
public abstract void methodA(String abc);
public abstract String methodB(String abc);
}
public final class ConcreteClass
extends BaseClass
{
}
これらの 2 つのクラスを別々のファイルにポップし、それらに対して javac を呼び出してpoofを実行すると、コンパイルされます。抽象メソッドは実装者によって実装されることを意図しているため、これは意味がありません。これをもう少し試してみると、コードのチャンクが実装されていないメソッドを呼び出そうとしたときにのみコンパイル エラーが発生します。
繰り返しになりますが、ここでの私の質問は、コンパイラがこれを許可する理由 (または、なぜこれを行う必要があるのか) を知っている人はいますか?
追加コメント:
- 最初のテストを行ったとき、元々 ConcreteClass を final としてマークしていませんでした。別のクラスがクラスを拡張できるので、コンパイラは文句を言わず、後で他のクラスがダウンするだろうと想定する可能性があります。道路はそれを処理しますが、クラスを最終としてマークすると、そうではないことがかなり明確になります。