Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型方法类型推断的困惑_Java_Wildcard_Type Inference_Generic Type Argument - Fatal编程技术网

Java泛型方法类型推断的困惑

Java泛型方法类型推断的困惑,java,wildcard,type-inference,generic-type-argument,Java,Wildcard,Type Inference,Generic Type Argument,示例方法如下所示: static <T> void doSomething(List<? super T> list1, List<? extends T> list2) { } static void doSomething(List此调用不将T绑定到特定类。由于泛型的类型擦除实现,Java不需要知道确切的T。只要传递的类型与声明一致,代码就应该编译;在您的情况下,对象和字符串的列表是一致的我同意宣言 让我们稍微扩展一下您的代码,以便将T强制绑定到特定类型

示例方法如下所示:

static <T> void doSomething(List<? super T> list1, List<? extends T> list2) { }

static void doSomething(List此调用不将
T
绑定到特定类。由于泛型的类型擦除实现,Java不需要知道确切的
T
。只要传递的类型与声明一致,代码就应该编译;在您的情况下,
对象
字符串
的列表是一致的我同意宣言

让我们稍微扩展一下您的代码,以便将
T
强制绑定到特定类型。最简单的方法可能是传递
Class
,如下所示:

doSomething(new ArrayList<Object>(), new ArrayList<String>());
static <T> void doSomething(List<? super T> list1, List<? extends T> list2, Class<T> cl) {
    System.out.println(cl);
}
两个调用都成功编译并生成输出

class java.lang.Object
class java.lang.String

此调用不将
T
绑定到特定类。由于泛型的类型擦除实现,Java不需要知道确切的
T
。只要传递的类型与声明一致,代码就应该编译;在您的情况下,
对象
字符串
的列表是不需要的支持宣言

让我们稍微扩展一下您的代码,以便将
T
强制绑定到特定类型。最简单的方法可能是传递
Class
,如下所示:

doSomething(new ArrayList<Object>(), new ArrayList<String>());
static <T> void doSomething(List<? super T> list1, List<? extends T> list2, Class<T> cl) {
    System.out.println(cl);
}
两个调用都成功编译并生成输出

class java.lang.Object
class java.lang.String

调用未将
T
绑定到特定类。下面是一个扩展代码以演示这一点的示例。@dasblinkenlight您可以将其作为答案发布。调用未将
T
绑定到特定类。下面是一个扩展代码以演示这一点的示例。@dasblinkenlight您可以将其作为答案发布。一个另一个有趣的例子是更多的类层次结构
doSomething(new ArrayList(),new ArrayList(),Number.class);
。这表明
T
实际上不必匹配任何一个列表的类型。它只需在它们之间(包括两者)。另一个有趣的例子是更多的类层次结构
doSomething(new ArrayList(),new ArrayList(),Number.class);
。这表明
T
实际上不必匹配任何一个列表的类型。它只需在它们之间(包括它们)。