我有这个界面
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吗?
答案 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。