Java 7 ビルド 21 に切り替えたところ、奇妙なコンパイル エラーが発生し始めました。たとえば、以下のコード スニペットはコンパイルされません (ただし、IntelliJ はエラーを表示しません)。
1 Iterable<?> parts = ImmutableList.<String>of("one", "two");
2 Function<?, String> function = new Function<Object, String>() {
3 @Override
4 public String apply(final Object input) {
5 return input.toString();
6 }
7 };
8 Iterable<String> result = Iterables.transform(parts, function);
9 System.out.println(result);
?
しかし、 2行目を次のように置き換えるとObject
2 Function<Object, String> function = new Function<Object, String>() {
その後、コンパイルは成功します。
私が得ているエラーはやや不可解です:
error: method transform in class Iterables cannot be applied to given types;
required: Iterable<F>,Function<? super F,? extends T>
found: Iterable<CAP#1>,Function<CAP#2,String>
reason: no instance(s) of type variable(s) F,T exist so that argument type Function<CAP#2,String>
conforms to formal parameter type Function<? super F,? extends T>
where F,T are type-variables:
F extends Object declared in method <F,T>transform(Iterable<F>,Function<? super F,? extends T>)
T extends Object declared in method <F,T>transform(Iterable<F>,Function<? super F,? extends T>)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ? extends Object
行 2 を次のように変更する
2 Function<? extends Object, String> function = new Function<Object, String>() {
効果はありません。
JDK 1.7.0_11-b21 を使用しています。これは、ビルド 4 で正常にコンパイルされていました。
これはjavac
バグですか、それとも私のものですか?