<T扩展Comparable <的问题?超级T >>

Majid Azimi:

我有一个三类:1.class Algorithm在中max()找到最大值Collection

public class Algorithm {

    public static <T extends Comparable<T>> T max(Collection<? extends T> coll) {
        T max = coll.iterator().next();

        for (T elm : coll) {
            if (max.compareTo(elm) < 0)
                max = elm;
        }

        return max;
    }
}

2.Class Fruit

public class Fruit implements Comparable<Fruit> {
    private String name;
    private int size;

    public Fruit(String name, int size) {
        this.name = name;
        this.size = size;
    }

    public int compareTo(Fruit that) {
        if (size < that.size)
            return -1;
        else if (size == that.size)
            return 0;
        else
            return 1;
    }
}

3.class Apple扩展Fruit

public class Apple extends Fruit {
    public Apple(int size) {
        super("Apple", size);
    }
}

现在的问题是这样的:

public class Main
{
    public static void main(String[] args) {        
        Apple a1 = new Apple(10);
        Apple a2 = new Apple(34);

        List<Apple> apples = Arrays.<Apple>asList(a1, a2);

        System.out.println(Collections.max(apples).size);
    }
}

根据这篇文章Java语法问题:我应该用这种方式写它:public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll)但这现在工作正常,为什么呢?Apple没有实现Comparable<Apple>,也没有实现super

[更新]
Java泛型和收藏集说:

如果没有super通配符,则List<Apple>即使List<Fruit>允许查找a的最大值,查找a的最大值也是非法的

亚当·佩恩特(Adam Paynter):

假设我们将max方法更改为

<T extends Comparable<T>> T max(Collection<? extends T> coll)

您将无法获取maxa的,List<Apple>因为Apple它没有实现Comparable<Apple>,而是实现了Comparable<Fruit>但是您和我都非常清楚,一个人Apple知道如何将自己与另一个人进行比较,Fruit因为它继承了该功能。

我们通过更改max对此的声明解决此问题

<T extends Comparable<? super T>> T max(Collection<? extends T> coll)

这意味着我们接受以下任何类T

  1. T implements Comparable<T>或...
  2. T implements Comparable<X>对于某些X这样X的超类T

为了找到max,我们必须确保的任何实例都T可以安全地接受的另一个实例T作为其compare方法的参数

在第一种情况下,很明显,任何实例都T可以安全地接受另一个实例T作为其compare(T)方法的参数

在第二种情况下,的任何实例都T可以安全地接受的另一个实例T作为其compare(X)方法的参数,因为的所有实例T也是的实例X

您的示例说明了第二种情况,其中TAppleX相对应Fruit

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

<T扩展Comparable <的问题?超级T >>

T扩展Comparable <T>

静态<T扩展Number&Comparable <?超级号码>>

Java 中的泛型 - 为什么我不能做 Comparable<? 扩展 T> 而不是 Comparable<? 超级T>?

为什么<T扩展Comparable>而不是<T实现Comparable>?

为什么T扩展可比性<?超级T>包括T?含义包括Comparable <T>?

Java-<T扩展Comparable <T >>的含义?

通用<T扩展Comparable <T>,V扩展T>是必需的V

java.util.Comparator.naturalOrder采用<T扩展Comparable <?超级T >>并返回Comparator <T>-为什么?

如何返回<T的通用数组扩展Comparable <?Java中的超级T >>?

通用<T扩展Comparable <?的说明 在collection.sort /类似代码中的超级T >>?

Java错误将参数传递给采用T的方法,其中T扩展了Comparable <T>

行类HanoiStack <T扩展Comparable <T >>扩展Stack <T>中的Java泛型编译错误

JAVA为什么分配这些变量时出现类型错误(T扩展Comparable <T>)

检查 BT 是否为 BST 并带有 T 扩展 Comparable<T> java

之间的区别?超级T>和<?在Java中扩展T>

什么是<?超级T>语法?

Comparable <T>和compareTo

Java泛型:如何在不使用原始类型的情况下强制转换为(T扩展Comparable <?super T>)

了解通配符约束<?超级T>

在实现java Comparable <T>类时出现问题

从Partial <T>扩展的Typescript接口为想要扩展T的扩展接口带来了钻石问题

在Collection上使用iterable <?超级T>

“ Comparable <T>”是否应为“功能接口”?

无法理解 Comparable<T> 转换

类型不匹配:无法从Comparator <capture#2-of?超级T>到Comparator <?超级T>

Scala:class [T]扩展T?

的T用途扩展ü?

Partial<T>,但扩展了方法