【问题标题】:What is the advantage of having typed interface over method that receives a certain type in Java?与在 Java 中接收某种类型的方法相比,具有类型化接口的优势是什么?
【发布时间】:2018-02-11 17:49:40
【问题描述】:

我正在用 Java 编写一个类,我想实现 Comparable 接口。这是课程:

public class Flight implements Comparable {
    private int flightTime;
    public int compareTo(Object o) {
        Flight f = (Flight) o;
        return this.flightTime - f.flightTime;
    }
}

现在我了解到我们还可以向界面添加类型,如下所示:

public class Flight implements Comparable<Flight> {
    private int flightTime;
    public int compareTo(Flight f) {
        return this.flightTime - f.flightTime;
    }
}

第二种实现的优势是什么(请不要将问题简化为泛型的优势)?

我对 Java 还很陌生,我怀疑添加类型一定有一些好处,因为从表面上看,实现实现了相同的目标。而且看起来compareTo(Object o) 的实现可能会为我们提供更多信息,因为我们可能正在测试instanceof 并可能处理错误。

【问题讨论】:

  • oracle.com/technetwork/articles/java/… 列出了某些使用泛型的好处,其中大多数情况可以应用于上述方法中的不同用例。
  • 另外,您不认为讨论使用一种方法优于另一种方法的好处过于宽泛吗?
  • @nullpointer 正如我所提到的,我对 Java 还很陌生,所以我不知道什么是太宽泛,什么不是
  • “我们也可以添加”您应该始终添加。见What is a raw type and why shouldn't we use it?

标签: java generics types interface


【解决方案1】:

对于您的第一个代码,如果您执行以下操作,您将在运行时遇到异常:

int i = new Flight().compareTo("xyz");

使用您的第二个代码,如果您尝试这样做,您将收到编译时错误。

抱歉,这是泛型的基本优势,它适用于您发布的特定案例。泛型只是将大量运行时错误转移到编译时。因为type erasure,他们实际上并没有做更多的事情。

【讨论】:

  • 如果我测试o instanceof Flight,我可以避免第一个示例中的运行时错误,但对吗?
  • @Yos - 绝对。但这引入了instanceof 测试(使您的实现复杂化),如果instanceof 测试失败,您会怎么做?该方法必须返回一些int 值或抛出异常。如果是前者,那么您允许调用代码将Flight 的实例与任何东西进行比较(从而为无意义的输入生成明显有意义的结果),如果是后者,那么调用代码必须处理可能的异常,这会使情况复杂化代码也是如此。 (此外,您还没有避免运行时错误。)
【解决方案2】:

在第一个示例中,您在运行时自行完成编译器在编译时可以为您执行的操作(第二个示例)。

这就是两个sn-ps区别的本质。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2020-06-26
    相关资源
    最近更新 更多