2017-09-03 84 views
1

我正在用Java编写一个类,我想实现Comparable接口。这是类:将类型化接口与在Java中接收某种类型的方法相比有什么优势?

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并可能处理错误。

+1

http://www.oracle.com/technetwork/articles/java/juneau-generics-2255374.html列出了某些**使用泛型的好处**,大多数情况下可以应用于不同的使用情况你的上述方法。 – nullpointer

+0

另外你不觉得它太宽泛,讨论使用一种方法的好处吗? – nullpointer

+0

@nullpointer正如我所提到的,我对Java相当陌生,所以我不知道什么是太宽泛,什么不是 – Yos

回答

3

有了您的第一个代码,你会如果你做这样的事情在运行时获取的异常:

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

你的第二个代码,如果你尝试这样做,你会得到一个编译时错误。

对不起,这是一般泛型的基本优势,它适用于您发布的特定情况。泛型只是移动了很多运行时错误来编译时间。由于type erasure,他们并没有做太多的事情。

+0

我可以避免第一个例子中的运行时错误,如果我测试了'o instanceof Flight'虽然正确吗? – Yos

+2

@Yos - 绝对。但是这会引入一个'instanceof'测试(使你的实现复杂化),如果'instanceof'测试失败你会怎么做?该方法必须返回一些“int”值或抛出异常。如果前者允许调用代码将“Flight”的实例与任何事情进行比较(从而为无意义输入产生明显有意义的结果),并且如果后者是调用代码,则调用代码必须处理可能的异常,这使得复杂代码也是如此。 (另外,您还没有避免运行时错误。) –

2

在第一个示例中,您将在运行时自己做什么,编译器可以在编译时为您做什么(第二个示例)。

这就是两个片段之间差异的本质。

相关问题