2013-04-10 637 views
-1

我嘗試按照這個Stackoverflow post,但它並沒有幫助我的目的,我想實現。我想知道它是否可以在Java中實現。這是問題陳述。我試圖研究Java反射,Haskel或者等,但它最終有兩個不同的對象。將兩種不同的對象類型傳遞給Java中的單個方法?

我有兩種類型的對象。

  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:請忽略語法,因爲我只是提供了一些代碼片段來清楚地說明我的問題。

+0

下投票是爲了什麼?這不是一個有效的編程問題嗎? – iankits 2013-04-10 10:46:11

回答

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

您可以在您的runOperation()中進行此項檢查。

if(activeSession instanceof org.simalliance.openmobileapi.Session){ 
    // Type 1 
} 
else if(activeSession instanceof com.mobilesecuritycard.openmobileapi.Session){ 
    // Type 2 
} 
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(); 
} 
2

你應該能夠用反射或甚至012來做到這一點,但是爲什麼?爲什麼不使用重載?定義了兩種方法:

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或反思。

+0

我用instanceOf,但我想你沒有得到我的問題。我不希望有兩個runOperation()方法。這可能是我不想要的最簡單明顯的解決方案。我不想重複該功能。 – iankits 2013-04-10 10:23:49

+0

我根據你的評論更新了我的答案。我勸你不要使用'instanceof'和一堆'if'語句,因爲這不是面向對象的。如果突然之間需要支持第三種會話,會發生什麼情況?你會添加另一個「if」嗎?這是不可維護的。特定於類型的行爲應該使用適當的語言結構來表示,例如方法重載。 – miorel 2013-04-10 10:29:58

+0

謝謝。對。我認爲我必須根據你的和其他人的回覆並基於我在互聯網上的研究來編寫兩個獨立的函數。但它最終將有兩個不同的應用程序打包在一個Android的apk內,我試圖避免。 : - | – iankits 2013-04-10 10:43:39

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 
} 
+0

謝謝。我已經試過這個,但mySession對象doesnot給出了msc_session或sim_session對象給出的mySession.openLogicalChannel(ID)。即msc_session.openLogicalChannel(ID)。不在我的上下文中工作 – iankits 2013-04-10 10:30:25

+0

因此投射到具有openLogicalChannel函數的對象 – BobTheBuilder 2013-04-10 10:31:54

+0

恐怕不會有幫助,因爲mySession對象中沒有任何內容。試過這個了。 : - | – iankits 2013-04-10 10:37:55