2017-11-09 4 views
0

私はinterface methodを同じライブラリのメソッドで呼び出されています。実装は、ライブラリを含むアプリケーションに含まれています。実装はアプリケーションごとに異なります。 interface methodを呼び出すには、calling methodinterfaceのインスタンスをclassでインスタンス化する必要があります。しかし、calling methodはライブラリにあるため、アプリケーションのクラスにアクセスすることはできません。 calling methodは、アプリケーションではなく、バックグラウンドサービスによって起動されます。ライブラリ内のインターフェイス、異なるアプリケーション内の実装、ライブラリからのメソッド呼び出し

ライブラリ内のインタフェース:

​​

クラスインターフェースを実装するアプリケーションで:

public class ClassA implements InterfaceA { 
    @Override 
    public void methodA() { 
     // do something 
    } 
} 

インタフェースメソッドを呼び出すライブラリにおける方法

public void callInterface() { 
    InterfaceA ia; 
    ia.methodA(); // how to get this to work? 
} 

interface methodをライブラリに呼び出すにはどうすればいいですか? e interfaceアプリケーションに実装されていますか?実装クラスはライブラリにアクセスできないアプリケーション内にあるため、私はライブラリからインターフェイスをインスタンス化できません。

+0

ライブラリに実装されているものが存在しないか、メソッド "callInterface"がステートレス実装の一部であることが間違っています。その場合、インプリメンテーションは入力として、またはGenericsを使用してメソッドに渡されます。メソッドを呼び出すライブラリクラスの詳細を明らかにしてください。 – shakeel

+0

@shakeelライブラリには実装がありません。それが問題です。ライブラリクラスは、どの実装クラスにもアクセスすることができません。 – khateeb

答えて

0

あなたはインターフェイスのインスタンスを持っている場合、それは仕事を得るために何かをする必要はありません。そうで

public void callInterface(InterfaceA ia) { 
    ia.methodA(); 
} 

そして、このメソッドを呼び出すライブラリー法には、このパラメータを追加し、 。アプリケーションがこのメソッドを呼び出すと、その実装を渡すことができます。

それとも、本当に別のインターフェイスを追加し、メソッド内のインターフェイスをインスタンス化する必要がある場合:

public void callInterface(Supplier<InterfaceA> iaSupplier) { 
    InterfaceA ia = iaSupplier.get(); 
    ia.methodA(); 
} 

https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.htmlを参照してください。

呼び出しメソッドは、アプリケーションではなくバックグラウンドサービスによって開始されます。

バックグラウンドサービスは何ですか?アプリケーションがその実装にそれを渡すための何らかの方法を追加する必要があります。

また、SPI(https://docs.oracle.com/javase/tutorial/ext/basics/spi.html)を使用することもできますが、過剰な使用になる可能性があります。

+0

ライブラリクラスには、実装クラスのいずれにもアクセスできません。インターフェイスにのみ。 – khateeb

+0

そして 'callInterface'の両方のバージョンでは、それは必要ありません。 –

+0

OSはジョブスケジューラを介してサービスを開始します。 'callInterface'は' ClassA'ではなく 'InterfaceA'にしかアクセスできません。 – khateeb

0
public void callInterface() { 
    InterfaceA ia; 
    ia.methodA(); // how to get this to work? 
} 

上記はコンパイルに問題があります。

ライブラリ関数は、別の答えに示されているように、メソッドのInterface InterfaceAをパラメータとして取る必要があります。また、ステートレスな実装の場合は、このメソッドを含むClassを使用して渡します。

関連する問題