【问题标题】:Do these two Java generic methods accept the same data types?这两个 Java 泛型方法是否接受相同的数据类型?
【发布时间】:2021-08-25 23:36:22
【问题描述】:

我是 Java 新手,我正在尝试学习泛型。我尝试实现binarySearch() 方法的简单版本,该方法也可以在Collections 类中找到。我查看了方法签名,它是这样的:

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {
  // definition
}

我想知道如果您将方法定义更改为此,上述方法是否仍然接受相同的数据类型:

public static <T extends Comparable<? super T>> int binarySearch(List<T> list, T key) {
  // definition
}

如果不是,两者有什么区别?谢谢!

【问题讨论】:

  • 首先,列表可以有与键类型不同的东西。您无法添加到列表中,并且密钥不可比较。
  • @matt 哦,我明白了。所以在第一个中,列表可以接受 T 的子类(不仅仅是 T),只要 T 实现 Comparable
  • 是的,List 与 List.

标签: java generics binary-search


【解决方案1】:

考虑这些类:

class A extends Comparable<A> { /* ... */ }
class B extends A { /* ... */ }

现在用这些类型定义一个键和一个列表:

A key = new B();
List<B> list = List.of(key);

您可以使用这些参数调用第一种形式,但不能使用第二种形式。

【讨论】:

  • 感谢您的回答。我将其标记为正确,因为作为初学者,这对我来说更容易理解。这两个答案今天都教会了我一些新东西。
【解决方案2】:

例如:

static class NonComparable {

}

static class MyComparable implements Comparable<NonComparable> {
    @Override
    public int compareTo(NonComparable o) {
        return 0; // irrelevant for the example
    }
}

然后声明参数:

List<MyComparable> list = Arrays.asList(new MyComparable());
NonComparable  nonComparable = new NonComparable();
binarySearch(list, nonComparable);

您的一个方法定义允许调用,另一个不允许。

【讨论】:

  • 感谢您的回答,今天它教会了我一些关于 Comparable 的新知识。我将对此进行更多研究
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2020-11-06
  • 2020-10-14
相关资源
最近更新 更多