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
实际上不必匹配任何一个列表的类型。它只需在它们之间(包括它们)。