2013-02-21 46 views
1

在一个静态工具中考虑一个通用的min方法,它意味着返回一个集合中的最小元素。为什么我们需要将其声明为通配符类型为类型参数提供了多大的灵活性?

public static <T extends Comparable<? super T>> T min(Set<? extends T> producerSet) 

会有什么,如果我们不是把它声明为

public static <T extends Comparable<T>> T min(Set<? extends T> producerSet) 

什么灵活性的类型参数外卡型给了我这里的问题?

+3

驱动式点评:这应该是介于安格莉卡朗格的泛型常见问题,因为一切都是。 (当涉及到泛型的问题,该文件是强制性阅读。) – millimoose 2013-02-21 15:29:14

+6

哎呀,这是在泛型教程:http://docs.oracle.com/javase/tutorial/extra/generics/morefun.html - 一个例子是,如果如果你没有使用'?Animal implements Comparable ',并且'Cat extends Animal',你有类吗? super T',那么你不能在'List '上调用'min()',因为它需要项目类型与它本身相媲美,而你只需要它与自己或超类型相媲美。 – millimoose 2013-02-21 15:32:19

回答

0

这涵盖了T是Comparable的实现者的子类的情况。考虑以下几点:

public static class A implements Comparable<A> { 

    public int compareTo(A o) { 
     return 0; 
    } 
} 
public static class B extends A {} 

public static <T extends Comparable<T>> T min(Set<? extends T> producerSet) { 
    return null; 
} 

public static void main(String[] args) { 
    Set<B> set = new HashSet<B>(); 
    min(set); // incompatible with method signature 
} 
相关问题