Java通用外卡绑定无法正常工作

时间:2014-05-28 15:30:36

标签: java generics

我遇到过一种情况,我无法理解所展示的编译器行为背后的原因。我写了以下代码片段 -

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>();
    }
}

1 个答案:

答案 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中正常编译)。