我尝试遵循这个Stackoverflow post,但这并没有帮助我实现我想要实现的目标。我想知道它是否可以在Java中实现。这是问题陈述。我试着研究Java反射,Haskel Either等,但它最终有两个不同的对象。
我有两种类型的对象。
com.mobilesecuritycard.openmobileapi.Session msc_session;
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:请忽略语法,因为我只是提供一些代码片段以使我的问题清楚。
答案 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
}