【问题标题】:Java - Implementing interface with Object argumentJava - 使用 Object 参数实现接口
【发布时间】:2012-07-07 08:46:29
【问题描述】:

我正在实现一个 Java 图形库(学习...)。因此,我写了一个界面

public interface DigraphInterface {
    public boolean isEmpty();
    public int size();
    public boolean isAdjacent(Object v, Object w);
    public void insertEdge(Object v, Object w);
    public void insertVertex(Object v);
    public void eraseEdge(Object o, Object w);
    public void eraseVertex(Object v);
    public void printDetails();
}

作为实现的第一步,我正在编写实现上述接口的 Digraph 类。但是,为了简单起见,我希望节点标识符为整数,因此我将函数定义为

    @Override
    public boolean isAdjacent(int v, int w) {
            // TODO Auto-generated method stub
            return adjList[v].contains(w) || adjList[w].contains(v);
    }  

但是,我遇到了错误,我需要用超类型覆盖或实现方法。有人可以向我解释这种行为的基础。另外,如果有人能解释一下,我们如何设计允许灵活添加任何类型组件的库。

【问题讨论】:

  • 除了int 甚至不是Object 之外,实现不能提供比接口更少的承诺。您的界面已经承诺处理任何对象
  • 那么,我该怎么做呢?当我希望实现另一个用字符串或其他东西标识节点的类时,我希望不需要更改接口。

标签: java graph


【解决方案1】:

你的界面说:

public boolean isAdjacent(Object v, Object w);

你实施:

public boolean isAdjacent(int v, int w)

对于java,这没有相同的签名,因此不是相同的方法。您可以做的是使用泛型,这取决于您的需要,但在这种情况下,您可以执行以下操作:

public interface DigraphInterface<T> {
    ...
    public boolean isAdjacent(T v, T w);
    ...
}

你的实现可能是:

public class DefaultDigraph<Integer> {
    ...
    public boolean isAdjacent(Integer v, Integer w) {
        ...
    }
    ...
}

当然你需要小心,因为Integer 可以为空,而int 不能。因此,在自动拆箱之前对参数进行空检查是个好主意。

【讨论】:

  • 我的理解是,当我们将 int 传递给方法时,Java 会在需要时自动将其转换为 Object。如果它没有找到任何带有 int 参数的方法,它必须将它绑定到带有 Object 参数的方法。我就是这么想的。
  • 是的,对于调用是,当你调用一个方法时,参数被装箱到它的 WrapperClass 中,在这种情况下是Integer,但是对于方法实现,签名必须是相同。因此这不起作用:public boolean isAdjacent(int v, int w)。收到了吗?
  • 好的,感谢弗朗西斯科向我解释。我将使用泛型来实现这一点。我的目标是拥有一个接口和多个实现,可以以不同的方式识别节点
  • 不客气,但请在开箱前检查空值,否则会出现其他问题。
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2015-11-08
  • 2017-10-21
  • 2012-04-28
相关资源
最近更新 更多