-1

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

我有两种类型的对象。

  1. com.mobilesecuritycard.openmobileapi.Session msc_session;

  2. org.simalliance.openmobileapi.Session sim_session

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

例如

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:请忽略语法,因为我只是提供一些代码片段来说明我的问题。

4

5 回答 5

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反射。

于 2013-04-10T10:21:52.010 回答
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 回答
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();
}
于 2013-04-10T10:21:00.000 回答
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 回答