gpt4 book ai didi

java - 实现接口(interface)如何提供附加功能?

转载 作者:行者123 更新时间:2023-12-01 12:32:54 25 4
gpt4 key购买 nike

我理解接口(interface)是类的契约,如果一个类实现了一个接口(interface),那么接口(interface)中的所有方法都必须在该类中。

这是一个涉及此 question 中的接口(interface)的示例这让我很困惑:

public class Contact implements Comparable<Contact> {

private String name;

public int compareTo(Contact other) {
return name.compareTo(other.name);
}
}

然后,您显然可以创建一个 ArrayList 并按名称对其进行排序。

List<Contact> contacts = new ArrayList<Contact>();
Collections.sort(contacts);

但是如果Contract没有像这样实现Comparable:

public class Contact {

private String name;

public int compareTo(Contact other) {
return name.compareTo(other.name);
}
}

即使 compareTo 方法仍然存在,调用 Collections.sort 也会出现编译时错误。

显然,通过实现接口(interface)可以提供额外的功能。除了强制结构之外,接口(interface)的目的是什么?

最佳答案

因为如果Contact implements Comparable<Contact>然后Contact Comparable<Contact> .

让我们看一下源代码,深入ComparableTimSort.countRunAndMakeAscending()有一行:

if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0)

相关位是 ((Comparable) a[runHi++]) -a[runHi++] 转换Comparable然后是 compareTo被称为作为 Comparable .

所以如果 Contact implements Comparable<Contact>我可以这样做:

final Comparable<Contact> contact = new Contact();

如果没有,那么我显然无法将该实例分配给 Comparable类型,因此我不知道(不诉诸反射)什么方法 Contact有。

通过实现Comparable我告诉编译器这个类 Comparable因此在需要时可以被视为一个。必须实现这些方法只是其副作用。

至于为什么是编译时而不是运行时错误,只需要看方法的声明 Collections.sort找出:

public static <T extends Comparable<? super T>> void sort(List<T> list)

所以这个方法是 generic method它的签名要求 List<T>哪里T extends Comparable<? super T> 。分解它有点棘手。

我们需要Textends Comparable<? super T> 。所以T需要implements Comparable<? super T>Comparable 的某个子类。 ? super T意味着它可以是 Comparable类型 T或任何父类(super class)型 - 即如果您的 compareTo可以排序Object那么它还可以排序T (根据里氏替换原则)。

关于java - 实现接口(interface)如何提供附加功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25803095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com