为什么第一种方法可以编译,而第二种方法不行?Set
和的泛型ImmutableSet.Builder
相同,其add
方法的类型签名也相同。
import java.util.Set;
import java.util.HashSet;
import com.google.common.collect.ImmutableSet;
public class F {
public static ImmutableSet<? extends Number> testImmutableSetBuilder() {
ImmutableSet.Builder<? extends Number> builder = ImmutableSet.builder();
Number n = Integer.valueOf(4);
builder.add(n);
return builder.build();
}
public static Set<? extends Number> testJavaSet() {
Set<? extends Number> builder = new HashSet<Number>();
Number n = Integer.valueOf(4);
builder.add(n);
return builder;
}
}
我正在使用 javac 版本 1.7.0_25 来构建。我在第二种方法中收到以下错误,但在第一种方法中没有。我相信在这两种情况下我都应该得到错误,因为将 aNumber
放入? extends Number
.
error: no suitable method found for add(Number)
builder.add(n);
^
method Set.add(CAP#1) is not applicable
(actual argument Number cannot be converted to CAP#1 by method invocation conversion)
where CAP#1 is a fresh type-variable:
CAP#1 extends Number from capture of ? extends Number