最初のメソッドはコンパイルされ、2 番目のメソッドはコンパイルされないのはなぜですか? 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 を使用しています。2 番目の方法では次のエラーが発生しますが、最初の方法では発生しません。Number
のコレクションにa を入れるのは型が正しくないため、どちらの場合でもエラーが発生するはずです? 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