Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现Java接口方法的正确方法_Java_Interface_Methods - Fatal编程技术网

实现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
对象。