-2

これがシナリオです。次のクラスとインターフェースがある場合

public interface Jobinfo {}

public interface SpecificJobinfo {}

public abstract class AbstractJob implements JobInfo{}

public class SpecificJob extends AbstractJob implements SpecificJobInfo{}

interface Service {
    execute(JobInfo);
    execute(SpecificJobInfo);
}

// implementing class

public class ServiceImpl implements Service{
    SpecificJob specificJob = new SpecificJob ();
    execute(specificJob);
}

どのメソッドが呼び出されるか - JobInfo または SpecificJobInfo を持つメソッド。

4

1 に答える 1

1

どちらのメソッドも適用可能(SpecificJob は と の両方JobInfoを実装するためSpecificJobInfo) であり、アクセス可能(つまり、これらはスーパークラスのプライベート メソッドではない) です。ルールは、常に最も具体的なメソッドが呼び出されることです。

この場合、JobInfoとは関連のない型であるため、最も具体的なメソッドはありません (メソッドSpecificJobInfoの両方のバリアントは最大限に固有です)。したがって、メソッド呼び出しがあいまいになり、コンパイル時エラーが発生します。execute

Java言語仕様の引用:

複数のメンバー メソッドがアクセス可能で、メソッド呼び出しに適用できる場合は、ランタイム メソッド ディスパッチの記述子を提供するために 1 つを選択する必要があります。Java プログラミング言語では、最も具体的な方法が選択されるという規則が使用されます。

非公式の直感は、最初のメソッドによって処理された呼び出しが、コンパイル時の型エラーなしで別のメソッドに渡される場合、あるメソッドが別のメソッドよりも具体的であるということです。

SpecificJobInfoが拡張されていればJobInfo、あいまいさは回避され、 が支持されていたでしょうexecute(SpecificJobInfo)

于 2013-02-27T18:55:03.440 に答える