实现Java接口方法的正确方法
我有这个接口实现Java接口方法的正确方法,java,interface,methods,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); } 公共接口MyInterface{ 收集发现(T); 集合FindAll(); T FindById(int-id); 无效添加(T); 脱空(T);
public interface MyInterface{
Collection<T> Find(T t);
Collection<T> FindAll();
T FindById(int id);
void Add(T t);
void Remove(T t);
}
公共接口MyInterface{
收集发现(T);
集合FindAll();
T FindById(int-id);
无效添加(T);
脱空(T);
}
如果需要保证T的id类型为int,那么对于T FindById(int-id)
方法我必须做什么?我应该创建另一个我的对象必须扩展才能使用FindById的接口吗
我应该创建另一个我的对象必须扩展才能使用的接口吗
FindById
是(尽管它不是特定于FindById
方法)。更准确地说,您应该有另一个接口,该接口可以保证您的类将具有您可以访问的整数ID。这样的东西应该足够了:
public interface HasId {
int GetId();
}
然后您可以使您的MyInterface
类使用T扩展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);
}
公共接口MyInterface{
收集发现(T);
集合FindAll();
T FindById(int-id);
无效添加(T);
脱空(T);
}
您只能将特定对象接收到您的集合中,就像这里的实体
一样,它肯定会有id
interface Entity {
int getId();
}
interface MyCollection<T extends Entity> {
T findById(int id);
}
接口实体{
int getId();
}
界面菌落{
T findById(int-id);
}
要真正实现该类型的安全性,以及非int
标识符的灵活性,请尝试以下操作:
public interface IdentifiedThing<I extends Serializable> {
I getId();
}
公共接口标识内容{
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);
}
公共接口MyInterface{
收集查找(IT t);
集合findAll();
它findById(I id);
无效添加(IT t);
空洞消除(IT t);
}
(我也将您的方法大小写固定为Java样式;-)这是一种模板方式。应该是出了什么问题
public interface MyInterface<T>{
公共接口MyInterface{
T是模板类型
当您实现这个接口时,应该给出一个类型来替换T,如果没有,T将被Object替换
如果你想保证返回类型中有int类型的id,我认为你是对的。唯一的缺点是id必须是一个对象,因此如果你需要将int转换为整数,你将遭受自动装箱/取消装箱的痛苦。@sk.true-与编程中的几乎所有事情一样,这是一种折衷。Robert可能会觉得编译时的安全性很好运行时性能受到影响。我不清楚这是怎么回事。这保证了类型安全,并且对象将有一个id?@Robert确切地说。您确保
MyInterface
只处理IT
实例,但更进一步,您要确保这些IT
实际上有一个相同的标识符键入指定为findById()
@millhouse的参数,这非常漂亮。谢谢。因此,在这种情况下,如果我在我的实现类中传入一个类似2的整数,我可以说return T.GetId()==T
?findById
接受一个整数,因此您可以调用findById(x.GetId())
,其中x
是HasId
对象。