我遇到过一种情况,我无法理解所展示的编译器行为背后的原因。我写了以下代码片段 -
public class OutgoingStub<T> {
public OutgoingStub<T> tryThis(T val){
return new OutgoingStub<T>();
}
public void f(Set<? extends Number> set){
}
public static void main(String[] args) {
Set<? extends Number> set = new HashSet<Integer>();
**OutgoingStub<Set<? extends Number>> stub = Mocktest.mock(set);** //Unable to assign the reuturn value in a variable. compiler complains.
}
}
class Mocktest {
public static <T> OutgoingStub<T> mock(T val){
return new OutgoingStub<T>();
}
}
答案 0 :(得分:4)
您应该明确告诉编译器在调用mock
时要使用的类型参数:
OutgoingStub<Set<? extends Number>> stub = Mocktest.<Set<? extends Number>>mock(set);
否则mock
的类型参数应该是什么的含糊不清。这称为类型见证,当编译器无法infer类型时,它是必要的。
这在JLS §15.12.2.8中有详细解释(这是Java 7 JLS - 请参阅下面的注释)。
注意您不再需要Java 8中的类型见证(即您当前的代码可以在Java 8中正常编译)。