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

时间:2014-06-22 10:20:29

标签: java wildcard type-inference generic-type-argument

样本方法如下:

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

我想知道在这种情况下会推断出什么类型以及什么逻辑。假设我这样称呼这个方法:

doSomething(new ArrayList<Object>(), new ArrayList<String>());

T 类型评估为 Object String

1 个答案:

答案 0 :(得分:2)

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

让我们稍微扩展您的代码,以便我们可以强制T绑定到特定类型。也许最简单的方法就是通过Class<T>,如下所示:

static <T> void doSomething(List<? super T> list1, List<? extends T> list2, Class<T> cl) {
    System.out.println(cl);
}

现在让我们尝试使用doSomethingString.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

Demo on ideone.