2011-11-17 50 views
0

正确的方法我有这个接口的Implmenting Java的接口方法

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

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

回答

2

要真正获得类型安全性,以及非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风格太;-)

+0

唯一的缺点是,ID必须是一个对象,所以如果你需要将整数转换为整数,你将遭受自动装箱/拆箱。 –

+0

@sk。确实如同几乎所有的编程事情一样,这是一个折衷。 Robert可能觉得编译时安全性值得运行时性能受到影响。 – millhouse

+0

我很困惑这是什么。这保证了类型安全,并且对象会有一个id? – Robert

3

我应该创建另一个接口,我的对象必须扩展才能使用 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); 
} 
+0

所以在这种情况下,如果我在我的实现类中传递一个像2这样的整数,我可以说'return T.GetId()== t'? – Robert

+0

'FindById'接受一个整数,所以你可以调用'FindById(x.GetId())',其中''''是'HasId'对象。 –

+0

太好了。非常感谢。 – Robert

0

你只能接受特定对象到您的收藏喜欢这里的Entity这将有id肯定是

interface Entity { 
    int getId(); 
} 

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

它模板方式在这里。并且有错误,应该是

public interface MyInterface<T>{ 

T是模板类型。

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

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