gpt4 book ai didi

Java泛型捕获和比较

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:11 24 4
gpt4 key购买 nike

这是一个容器的实现,可以与具有兼容 key 的任何其他容器进行比较。我在 Java 中使用泛型时遇到一个奇怪的错误,有什么想法吗?

    private static class Container
<Key extends Comparable<? super Key>, Value>
implements Comparable<Container<? super Key, ?>>
{
public Key key;
public Value value;
public Container(Key k, Value v) {
key = k;
value = v;
}
public int compareTo(Container<? super Key, ?> o) {
return key.compareTo(o.key);
}
}
...

这是错误:

    compareTo(capture#98 of ? super Key) in
java.lang.Comparable<capture#98 of ? super Key> cannot be applied to
(java.lang.Comparable<? super capture#822 of ? super Key>)
return key.compareTo(o.key);
^
1 error

最佳答案

PECS:生产者扩展,消费者 super 。

让我们从 compareTo 方法开始倒推。您想要与容器进行比较,并且想要使用键进行比较(因此是 key.compareTo(o.key))。这意味着您的 o必须产生 Key ,还有你的 key必须消耗 Key .第一部分意味着您的方法声明应该是 public int compareTo(Container<? extends Key, ?> o) ,这意味着你应该实现 Comparable<Container<? extends Key, ?>> .第二部分表示您的 Key应该是 Comparable<? super Key> ,这就是你的方式。

private static class Container<Key extends Comparable<? super Key>, Value>
implements Comparable<Container<? extends Key, ?>> {

public Key key;
public Value value;

public Container(Key k, Value v) {
key = k;
value = v;
}

public int compareTo(Container<? extends Key, ?> o) {
return key.compareTo(o.key);
}
}

编辑:完全按照下面的评论,声明如下。请注意调用 compareTo 的键的翻转,以及 Key 是如何进行的根本不再需要实现 Comparable。你只需要拿一个Container可以生成一些可以使用 Key 的 key

private static class Container<Key, Value> implements
Comparable<Container<? extends Comparable<? super Key>, ?>> {

//fields and constructors...

public int compareTo(Container<? extends Comparable<? super Key>, ?> o) {
return -o.key.compareTo(key);
}
}

关于Java泛型捕获和比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3450474/

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