以下の標準 Java ストリームの場合、StreamEx よりも変数の型を「計算」する方が適切であることに気付きました。これは奇妙です。人々は StreamEx を愛用し、どこでも使用していますが、コードが「?」で汚染されてしまうからです。を使いたいのですList<Class<?>
が、StreamEx は強制的に を使用させますList<? extends Class<?>>
。StreamEx がこのように機能する理由を誰か説明できますか? 目的の変数型を StreamEx で何とか使用できますか?
private static List<? extends Class<?>>
fooList_StreamEx_Compiles(List<Integer> input) {
return StreamEx.of(input)
.map(x -> foo())
.toList();
}
private static List<Class<?>>
fooList_StreamEx_Error(List<Integer> input) {
return StreamEx.of(input)
.map(x -> foo())
// Error: incompatible types: java.util.List<java.lang.Class<capture#1 of ?>>
// cannot be converted to java.util.List<java.lang.Class<?>>
.toList();
}
private static List<Class<?>> fooList(List<Integer> input) {
return input
.stream()
.map(x -> foo())
.collect(Collectors.toList());
}
private static Class<?> foo() {
return String.class;
}
StreamEx 0.7.0 と Java 11 を使用しています