2012-09-21 81 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

相关问题