【问题标题】:Correct Way of Implementing Java Interface MethodJava接口方法的正确实现方式
【发布时间】:2011-11-17 05:17:06
【问题描述】:

我有这个界面

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

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

【问题讨论】:

    标签: java interface methods


    【解决方案1】:

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

    【讨论】:

    • 所以在这种情况下,如果我在我的实现类中传入一个像 2 这样的整数,我可以说return T.GetId() == t?
    • FindById 接受一个整数,所以你可以直接调用FindById(x.GetId()),其中xHasId 对象。
    【解决方案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 风格 ;-)

    【讨论】:

    • 唯一的缺点是 id 必须是一个对象,因此如果您需要将 int 转换为 Integers,您将遭受自动装箱/拆箱。
    • @sk。是的——就像编程中的几乎所有事情一样,这是一个权衡。 Robert 可能觉得编译时安全值得运行时性能损失。
    • 我对它的作用感到困惑。这保证了类型安全并且对象将有一个 id?
    • @Robert 完全正确。您要确保 MyInterface 只会处理 IT 实例,但是进一步,您要确保这些 ITs 实际上具有一个标识符与findById()的参数指定的类型相同
    • @millhouse 这非常漂亮。谢谢。
    【解决方案3】:

    您可以只接受特定对象到您的集合中,例如这里的 Entity 肯定会有 id

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

    【讨论】:

      【解决方案4】:

      这是一种模板方式。而且有问题,应该是

      public interface MyInterface<T>{
      

      T 是模板类型。

      实现这个接口时,需要给一个类型来替换 T ,如果没有, T 会被 Object 替换。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 2021-01-11
        相关资源
        最近更新 更多