次のコードがjdk8u45以降でコンパイルされるのに、jdk8u25で失敗する理由を誰かが理解するのを手伝ってくれませんか? JDKのリリースノートを調べましたが、問題に関連するものが見つからなかったか、見逃した可能性があります。
コード
public class Main {
static class Param {
final int id;
Param(int id) {
this.id = id;
}
}
static class Subtask {
final Param param;
Subtask(Param param) {
this.param = param;
}
}
public static void main(String[] args) {
List<? extends Param> params = IntStream.range(1, 100).mapToObj(Param::new).collect(Collectors.toList());
NavigableMap<String, Subtask> map = params.stream()
.collect(Collectors.toMap(p -> UUID.randomUUID().toString(), Subtask::new, (a, b) -> a, TreeMap::new));
}
}
jdk8u25例外:
Error:(33, 17) Java: no suitable method found for collect(Java.util.stream.Collector<org.ka.Main.Param,capture#1 of ?,Java.util.TreeMap<Java.lang.String,org.ka.Main.Subtask>>)
method Java.util.stream.Stream.<R>collect(Java.util.function.Supplier<R>,Java.util.function.BiConsumer<R,? super capture#2 of ? extends org.ka.Main.Param>,Java.util.function.BiConsumer<R,R>) is not applicable
(cannot infer type-variable(s) R
(actual and formal argument lists differ in length))
method Java.util.stream.Stream.<R,A>collect(Java.util.stream.Collector<? super capture#2 of ? extends org.ka.Main.Param,A,R>) is not applicable
(cannot infer type-variable(s) R,A,capture#3 of ?,T,K,U,M,K,V
(argument mismatch; Java.util.stream.Collector<capture#2 of ? extends org.ka.Main.Param,capture#4 of ?,Java.util.TreeMap<Java.lang.Object,org.ka.Main.Subtask>> cannot be converted to Java.util.stream.Collector<? super capture#2 of ? extends org.ka.Main.Param,capture#4 of ?,Java.util.TreeMap<Java.lang.Object,org.ka.Main.Subtask>>))
私は型推論で同様の問題を抱えていましたが、それは8u5と8u25の間のどこかで壊れ、8u40で修正されました。 8u40のバグ修正リストには、 ネストされたラムダボディが過負荷解決でいくつかのメソッドを誤って除外している に関係するjavac修正がいくつかあります。
これが 8u40のすべてのバグ修正 のリストです。