2015-12-08 82 views
2

MyInt.java:從接口實例分配一個對象到另一接口實例

interface Outer{ 
    void ofoo(); 
    interface Inner { 
     void ifoo(); 
    } 
} 

MyClass.java:

class MyInfClass implements Outer, Outer.Inner{ 
    int x; 
    public void ofoo{ 
     // 
    } 
    public void ifoo{ 
     // 
    } 
} 

class MyClass{ 
    void testFoo(){ 
     Outer obj = new MyInfClass(); 
     Inner iObj; 
     //iObj = obj; Tried this and got compilation error 
//Out of wild guess I tried the following 
     iObj = (MyInfClass) obj; //Runs Successfully 
     iObj.ifoo(); 
    } 
} 

定義此行爲和是它適用於其它情形一樣

Interface interfaceRef = new SubClass(); // SubClass implements the Interface 
SuperClass superClassRef = (SubClass) interfaceRef; 

是否有任何其他正確的方法來做到這一點?

+1

創建對象時,最好的辦法是使用類名稱。沒有必要進行類型檢查和轉換:您知道該對象是什麼類型。你創造了它。 – xmjx

回答

2

一般的解決方法是使用更普遍的interface只有當它不會破壞其他代碼。在你的情況下,使用Outer接口會破壞事物,因此請使用實際的類。

interface Outer { 

    void ofoo(); 

    interface Inner { 

     void ifoo(); 
    } 
} 

class MyInfClass implements Outer, Outer.Inner { 

    int x; 

    @Override 
    public void ofoo() { 
     // 
    } 

    @Override 
    public void ifoo() { 
     // 
    } 
} 

public void test() { 
    MyInfClass mic = new MyInfClass(); 
    Outer obj = mic; 
    Outer.Inner iObj = mic; 
} 
2
iObj = obj; 

因爲Outer不是Inner子接口不通過編譯。

iObj = (MyInfClass) obj; 

經過編譯因爲MyInfClass實現Inner,所以MyInfClass參考可以被安全地分配給Inner變量。

但是,做出這樣的分配最安全的方式是鑄造之前測試的obj類型:

if (obj instanceof Inner) 
    iobj = (Inner) obj; 
+0

這是否可以應用於類似的場景? – Sab

+0

@Sab什麼情況? – Eran

+0

像這樣'Interface interfaceRef = new SubClass(); // SubClass實現接口 SuperClass superClassRef =(SubClass)interfaceRef;' – Sab