实现Java接口方法的正确方法

时间:2011-11-17 05:17:06

标签: java interface methods

我有这个界面

public interface MyInterface{
    Collection<T> Find(T t);
    Collection<T> FindAll();
    T FindById(int id);
    void Add(T t);
    void Remove(T t);
}

如果需要保证T的Id类型为int,我必须为T FindById(int id)方法做什么?我应该创建另一个接口,我的对象必须扩展为使用FindById吗?

4 个答案:

答案 0 :(得分:4)

  

我应该创建另一个我的对象必须扩展才能使用的接口   FindById?

是(虽然它并非特定于FindById方法)。更准确地说,您应该有另一个接口,可以保证您的类将具有您可以访问的整数ID。这样的事情就足够了:

public interface HasId {
    int GetId();
}

然后,您可以使MyInterface班级使用T extends HasId,如下所示:

public interface MyInterface<T extends HasId> {
    Collection<T> Find(T t);
    Collection<T> FindAll();
    T FindById(int id);
    void Add(T t);
    void Remove(T t);
} 

答案 1 :(得分:3)

要真正获得类型安全性以及非int标识符的灵活性,请尝试以下方法:

public interface IdentifiedThing<I extends Serializable> {
    I getId();
}

然后您可以锁定输入:

public interface MyInterface<I extends Serializable, IT extends IdentifiedThing<I>> {
    Collection<IT> find(IT t);
    Collection<IT> findAll();
    IT findById(I id);
    void add(IT t);
    void remove(IT t);
}

(我已经将你的方法大小写修改为Java风格; - )

答案 2 :(得分:1)

您只能接受特定对象进入您的收藏集,就像这里Entity肯定有id一样

interface Entity {
    int getId();
}

interface MyCollection<T extends Entity> {
    T findById(int id);
}

答案 3 :(得分:0)

这是一个模板方式。而且有些不对劲,应该是

public interface MyInterface<T>{

T是模板类型。

当你实现这个接口时,应该给出一个类型来替换T,如果没有,T将被Object替换。

我认为你是对的,如果你想保证在返回类型中有一个int类型的id。