java - 在下面的示例中, "List<? extends T>"是必要的吗?或者 "List<T>"会做同样的事情吗?

标签 java generics wildcard type-bounds

我明白

List<? extends T>

允许列表是 T(或 T 本身)的任何子类型,并且

List<T>

仅允许 T 类型的列表。但是,请查看以下方法签名:

public static <T extends Object & Comparable<? super T>> T findMax(List<? extends T> myList, int begin, int end){

以及以下类:

public class ClassA{

}
public class ClassB extends ClassA implements Comparable<ClassA>{
public int compareTo(ClassA s){
    //do comparison
}
}
public class ClassC extends ClassB{

}

假设 T 是 ClassB,并且我想为我的列表传递 T 的子类型(ClassC):

public static void main(String[] args){
    List<ClassC> myC = new ArrayList<ClassC>();
    ClassC a = findMax(myC, 2, 3);
}

在这种情况下,java如何推断T是ClassB,而不是ClassC?如果它无法推断 ClassB(并且实际上推断 ClassC),那么下面的方法签名(没有“List”)不是等效的吗?

public static <T extends Object & Comparable<? super T>> T findMax(List<T> myList, int begin, int end){

谢谢, jack

最佳答案

首先,? extends Object 没有添加任何值,因为一切都扩展了 Object,因此这两个方法是等效的:

public static <T extends Object & Comparable<? super T>> T findMax(List<T> myList, int begin, int end)
public static <T extends Comparable<? super T>> T findMax(List<T> myList, int begin, int end)

进行了简化后,您的问题基本上是等价的:

public static <T extends Comparable<? super T>> T findMax(List<T> myList, int begin, int end)
public static <T extends Comparable<? super T>> T findMax(List<? extends T> myList, int begin, int end)

它们(不*相同。

原因是,使用第二种方法时,您可以传入一个 List,其类型是返回类型的子类,而在第一个方法中,List 的类型必须与以下类型相同返回的类型。

关于java - 在下面的示例中, "List<? extends T>"是必要的吗?或者 "List<T>"会做同样的事情吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122302/

相关文章:

java - Jersey 休息 :How to write a jersey method including verifying HTTP Authorization

java - 动态比较字符串和对象的 toString() 方法

c# - WinRT 不允许自定义泛型类型或接口(interface)的原因

mysql - 连接字符串修改(替换、连接、修剪)

php - 在 PHP 中获取与通配符匹配的字符串

Java ASCII 数字问题

java - 在Java中使用正则表达式在字符串中添加分隔符

c# - 我可以在 List<T> 中搜索特定值吗?

swift - Swift 如何消除泛型构造函数的歧义?

makefile - GNU使通配符替代?