将两种不同的Object类型传递给Java中的单个方法?

时间:2013-04-10 10:16:47

标签: java android oop object smartcard

我尝试遵循这个Stackoverflow post,但这并没有帮助我实现我想要实现的目标。我想知道它是否可以在Java中实现。这是问题陈述。我试着研究Java反射,Haskel Either等,但它最终有两个不同的对象。

我有两种类型的对象。

  1.   

    com.mobilesecuritycard.openmobileapi.Session msc_session;

  2.   

    org.simalliance.openmobileapi.Session sim_session

  3. 我想要一个接受上面给出的两个对象中的任何一个的方法。

    例如

    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设备上的不同安全元素。所以,我不想为不同的对象编写两个不同的runOperation()方法。更准确地说,是否可以将对象类型转换为另一个对象。我不确定这一点。任何指示或帮助将不胜感激。我希望,我明确表达了我想要实现的目标。

    PS:请忽略语法,因为我只是提供一些代码片段以使我的问题清楚。

5 个答案:

答案 0 :(得分:2)

你应该能够通过反射甚至只是instanceof来做到这一点,但为什么呢?为什么不使用重载?定义两种方法:

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

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

如果目标是减少代码重复,那么使用单个方法但是它采用两种类型会话中最不常见的祖先超类,希望不是Object

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

如有必要,请实施两个版本的doSomethingMoreSpecific()。这将是面向对象的做事方式,而不是instanceof或反思。

答案 1 :(得分:0)

if(activeSession instanceof com.mobilesecuritycard.openmobileapi.Session) {
    // some stuff
} else if(activeSession instanceof org.simalliance.openmobileapi.Session) {
    // some other stuff
} 

答案 2 :(得分:0)

您可以在runOperation()

中执行此操作
if(activeSession instanceof org.simalliance.openmobileapi.Session){
    // Type 1
}
else if(activeSession instanceof com.mobilesecuritycard.openmobileapi.Session){
    // Type 2
}

答案 3 :(得分:0)

让人想到的一个解决方案是让两个对象都实现一个公共接口。

例如

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();
}

答案 4 :(得分:0)

  

是否可以将对象类型转换为另一个对象?

是的,你可以cast

你可以检查并施放:

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 
}