2012-09-21 36 views
6

的對象比方說,我有一個接口在Java中:類實現接口應該能夠只添加同一類

interface I { 
    void add(I foo); 
} 

,以及兩個類C和d實現此接口。

有沒有什麼辦法可以修改接口這樣,我只能這樣做:

C c = new C(); 
c.add(new C()); 

,但不

c.add(new D()); 

我對考試這個問題,但我唯一的想法就是使用的instanceof運營商在方法的定義:

class C implements I { 
    public void add(I foo) { 
     if (foo instanceof C) { 
      System.out.println("instance of C"); 
     } else { 
      System.out.println("another instance"); 
     } 
    } 
} 

不過,我不知道如何修改界面這樣我產生相同的效果。

感謝

回答

7

是 - 你需要仿製藥:

interface I <T extends I<T>> { 
    void add(T foo); 
} 

要定義一個類來使用它,像這樣的代碼:

class C implements I<C> { 
    @Override 
    public void add(C foo) { 
     // 
    } 
} 

注意,有沒有辦法阻止該編碼器的實現者(假設D也實現了I):

class C implements I<D> { 
    @Override 
    public void add(D foo) { 
     // 
    } 
} 

然而,這隻會是一個問題,如果C類的編碼器知道D類的存在,並選擇使用它,這是不可能的,如果他們都集中在編碼C類。

即使給出了這個警告,如果我設置了這個考題,我期望上面的答案。

+1

這種方法不是簡單的。例如,你仍然可以做一些事情,比如'D類實現I '。然而,這是一個非常強烈的意圖指標,違反上述規定的開發者應該得到他們所得到的任何結果。 – Dunes

+2

爲了避免關於非參數化類型的警告,聲明應該是'interface I >'。 –

+0

@波希米亞感謝! – Claudiu

相關問題