3

インターフェイスによって定義されたクラスがあります

public interface Test {
    void testMethod();
}

Test test = new TestImpl();

public class TestImpl implements Test {
    @Override
    public void testMethod() {
         //Nothing to do here
    }

    public void anotherMethod() {
        //I am adding this method in the implementation only.
    }
}

anotherMethod を呼び出すにはどうすればよいですか?

test.anotherMethod(); //Does not work.

実装でいくつかのメソッドを定義できるようにしたいのは、私の製品コードでは、Test インターフェースが非常に幅広いクラスをカバーし、複数のクラスによって実装されているためです。実装で定義されたメソッドを使用して、単体テストの DI フレームワークでカバーされていない依存関係を設定するため、メソッドは実装ごとに変化します。

4

6 に答える 6

6

問題は次の行にあります。

Test test = new TestImpl();

これは、新しいオブジェクトが TestImpl であることを忘れて、それを単純な古い Test として扱うようにコンパイラに指示します。ご存じのとおり、Test には anotherMethod() がありません。

あなたがしたことは、「アップキャスト」(オブジェクトをより一般的な型にキャストすること) と呼ばれます。別のポスターが言ったように、アップキャストしないことで問題を解決できます。

TestImpl test = new TestImpl();

Test オブジェクトが実際に TestImpl であることが確実な場合は、それをダウンキャストできます(より具体的な型であることをコンパイラに伝えます)。

Test test = new TestImpl();
:
((TestImpl) test).anotherMethod();

ただし、ClassCastException が発生する可能性があるため、これは通常はお勧めできません。コンパイラに反対するのではなく、コンパイラと協力してください。

于 2012-03-16T06:35:08.807 に答える
2

使用する

TestImpl test = new TestImpl();

それから

test.anotherMethod();//It will work now

あなたの Interface 参照を通して、そのインターフェイスで定義されていないメソッドを呼び出すことは不可能だと思います。

于 2012-03-16T06:31:13.350 に答える
2

実装クラスに直接キャストすることを避けたい場合は、別のインターフェイスを作成します。

public interface SpecificTest extends Test { 
    void anotherMethod();
}

次に、 TestImpl にそのインターフェイスを実装させます (つまり、 Test または SpecificTest として宣言できます)。

SpecificTest test = new TestImpl();
test.anotherMethod();
于 2012-03-16T15:27:46.550 に答える
1

もちろん、上記のようにメソッドにアクセスできますが、プログラミングのベスト プラクティスに従う必要があります。したがって、必要なメソッドを Interface1 に追加できない場合は、Interface1 を拡張する Interface2 を作成し、最後にメソッドを追加します。

于 2012-03-16T12:06:36.397 に答える
0

具象クラスに型キャストしたくない場合は、anotherMethod() をプライベート メソッドとして作成し、ロジックに基づいて testMethod() 内で呼び出すことができます。

たとえば。

testMethod()
{
   if(foo)
  {
     anotherMethod();
  }
}

これは、親クラス/インターフェイス参照を使用してそれらを呼び出すことができないため、子クラスに新しいメソッドを作成したくない場合に使用できる回避策です。

于 2015-05-07T18:04:50.503 に答える
0

そのメソッドを実装する実装クラスにキャストすると、それを呼び出すことができます。

Test test = new TestImpl();

// ... and later / somewhere else

((TestImpl) test).anotherMethod();
于 2012-03-16T06:34:42.790 に答える