样本方法如下:
static <T> void doSomething(List<? super T> list1, List<? extends T> list2) { }
我想知道在这种情况下会推断出什么类型以及什么逻辑。假设我这样称呼这个方法:
doSomething(new ArrayList<Object>(), new ArrayList<String>());
将 T 类型评估为 Object 或 String ?
答案 0 :(得分:2)
此调用不会将T
绑定到特定类。由于泛型的类型擦除实现,Java不需要知道确切的T
。只要您传递的类型与声明一致,代码就应该编译;在您的情况下,Object
和String
的列表与声明一致。
让我们稍微扩展您的代码,以便我们可以强制T
绑定到特定类型。也许最简单的方法就是通过Class<T>
,如下所示:
static <T> void doSomething(List<? super T> list1, List<? extends T> list2, Class<T> cl) {
System.out.println(cl);
}
现在让我们尝试使用doSomething
和String.class
来调用Object.class
:
doSomething(new ArrayList<Object>(), new ArrayList<String>(), Object.class);
doSomething(new ArrayList<Object>(), new ArrayList<String>(), String.class);
两个调用都成功编译,生成输出
class java.lang.Object
class java.lang.String