2013-01-13 30 views
2

這是我的整體工作流程。首先創建一個接口:Java中的界面敏感操作

public interface foo { 
    void bar(Baz b); 
} 

然後做出,例如,與不同對象向量都實現上述接口:

myVector.add(new Ex); //both Ex and Why implement foo. 
myVector.add(new Why); 

最後,使用該接口:

for(int i=0; i<myVector.size(); i++) { 
    myVector.get(i).bar(b); 
} 

但是,由於顯而易見的原因,這會產生編譯時錯誤:

The method bar() is undefined for the type Object

因爲Ex和爲什麼不相關,鑄造將不起作用。嘗試趕上鑄造前,然後爲什麼是一個可怕的解決方法。讓Ex和爲什麼擴展Bar_doers也聽起來都不簡單,因爲這樣做會消除接口。

如何執行關心Object是否實現給定接口的操作,而不是某個對象是否爲給定類?

+0

鑄造成'foo'不可能爲什麼? –

+2

如果你已經編寫了接口,你可以在接口中添加foo()方法。那麼它應該工作。 – Pankaj

+1

供參考:所有類型都以大寫字母開頭是慣用的;所以它應該是'Foo',而不是你的界面的'foo'。 –

回答

11

您需要了解generics

假設你使用的是標準的Java容器中,然後在你的情況下,解決方案是定義myVector這樣的:

List<foo> myVector = new ArrayList<foo>(); 
+0

+1不要使用Vector,你可以List和ArrayList更好。 –

+0

但是在這種情況下,他將無法添加Why和Ex兩種類型的Object。 – Pankaj

+0

如果'myVector'不是'List',而是某種不支持泛型的庫類型? –

2

它們轉換成你的界面,它會工作:

for(int i=0; i<myVector.size(); i++) { 
    ((foo)myVector.get(i)).foo(b); 
} 
+0

這有效,但它不是特別優雅。 –

+0

@OliCharlesworth,但它絕對有效。 –

+1

@OliCharlesworth是的。泛型是一種更好的方法,但聽起來OP可能會首先使用基本繼承的一些幫助。 –

1
public interface A { 
    public void myMethod(); 
} 




public class B implements A { 

    @Override 
    public void myMethod() { 
     System.out.println("B"); 
    } 

} 


import java.util.ArrayList; 
import java.util.List; 



public class C implements A { 

    @Override 
    public void myMethod() { 
     System.out.println("C"); 
    } 

    public static void main(String[] args){ 
     List<A> list = new ArrayList<>(); 
     list.add(new B()); 
     list.add(new C()); 

     for(A obj : list){ 
      obj.myMethod(); 
     } 
    } 

} 

上面會打印:

B 
C 
+0

這是正確的,可以用來顯示接口和類的新手示例,但答案比我需要的時間更長。 –