-1

この Stackoverflowの投稿に従おうとしましたが、達成したい目的には役立っていませんでした。Javaで達成できるか知りたいです。問題文はこちら。Java リフレクション、Haskel のどちらかなどを調べようとしましたが、2 つの異なるオブジェクトを持つことになります。

私は2種類のオブジェクトを持っています。

  1. com.mobilesecuritycard.openmobileapi.Session msc_session;

  2. org.simalliance.openmobileapi.Session sim_session

上記の 2 つのオブジェクトのいずれかを受け入れるメソッドが必要です。

例えば

public void runOperation(Object activeSession) {

activeSession.openLogicalChannel(APPLET_AID);
-- do the rest of operations ---
}

以下のようにその機能を使用したい

if(isSetSIMSessionTrue()){
    Log.i(LOG_TAG, "Using SIM Session as its True");
    sim_session = getSim_session();
    runOperation((org.simalliance.openmobileapi.Session) sim_session);
} else{
    Log.i(LOG_TAG, "Using MSC Session as its false");
    msc_session = getMSCSession();
    runOperation((com.mobilesecuritycard.openmobileapi.Session) msc_session);
}

を使用して正しいオブジェクトクラスを受け取ることさえできます

String classNameToBeLoaded = activeSession.getClass().getName(); 

ただし、オブジェクトのプロパティを activeSession オブジェクトに取得することはまだできません。

いずれかのセッション オブジェクトを runOperation メソッドに渡し、残りの操作を実行するために activeSession のみを使用する方法はありますか。両方のオブジェクトのメソッドと機能は同じですが、Android デバイスでは異なるセキュア エレメントにアクセスします。したがって、異なるオブジェクトに対して 2 つの異なる runOperation() メソッドを記述したくありません。より正確に言うと、オブジェクト タイプを別のオブジェクトにキャストすることは可能ですか。これについてはよくわかりません。任意のポインタまたはヘルプに感謝します。私が達成したいことを明確にしたことを願っています。

PS: 質問を明確にするためにいくつかのコード スニペットを提供しているだけなので、構文は無視してください。

4

5 に答える 5

2

リフレクションまたは だけinstanceofでこれを行うことができるはずですが、なぜですか? オーバーロードを使用しないのはなぜですか? 2 つのメソッドを定義します。

public void runOperation(com.mobilesecuritycard.openmobileapi.Session session) {
}

public void runOperation(org.simalliance.openmobileapi.Session session) {
}

目標がコードの重複を減らすことである場合は、単一のメソッドを使用しますが、2 つのタイプのセッションの最も一般的でない先祖スーパークラスを使用しますObject

public void runOperation(SessionSuperclass session) {
  // do something that can work with any type of session
  doSomethingMoreSpecific(session);
}

また、必要に応じて の 2 つのバージョンを実装しますdoSomethingMoreSpecific()。それは物事を行うオブジェクト指向の方法でありinstanceof、リフレクションではありません。

于 2013-04-10T10:21:52.010 に答える
0

オブジェクト型を別のオブジェクトにキャストすることは可能ですか?

はい、キャストできます。

以下を確認してキャストできます。

if(activeSession instanceof org.simalliance.openmobileapi.Session){
    org.simalliance.openmobileapi.Session mySession = (org.simalliance.openmobileapi.Session) activeSession 
}
else if(activeSession instanceof com.mobilesecuritycard.openmobileapi.Session) {
    com.mobilesecuritycard.openmobileapi.Session mySession = (com.mobilesecuritycard.openmobileapi.Session) activeSession 
}
于 2013-04-10T10:22:38.850 に答える
0

頭に浮かぶ 1 つの解決策は、両方のオブジェクトに共通のインターフェイスを実装させることです。

例えば

public interface ObjectIF
{
    public void doSomething();
}

インターフェイスを実装するクラスをいくつか用意します。

public class ClassOne implements ObjectIF
{
    public void doSomething() { // Code }
}

public class ClassTwo implements ObjectIF
{
    public void doSomething() { // Code }
}

メソッドを使用すると、次のようなことができます。

public void doSomethingWithObject(ObjectIF object)
{
    // Provided an object implements the interface, it can be passed here.
    object.doSomething();
}
于 2013-04-10T10:21:00.000 に答える
0
if(activeSession instanceof com.mobilesecuritycard.openmobileapi.Session) {
    // some stuff
} else if(activeSession instanceof org.simalliance.openmobileapi.Session) {
    // some other stuff
} 
于 2013-04-10T10:19:46.160 に答える
0

このチェックは で行うことができますrunOperation()

if(activeSession instanceof org.simalliance.openmobileapi.Session){
    // Type 1
}
else if(activeSession instanceof com.mobilesecuritycard.openmobileapi.Session){
    // Type 2
}
于 2013-04-10T10:20:17.530 に答える