【发布时间】:2019-04-03 12:52:26
【问题描述】:
我有以下代码
public class TeeingCollector {
public static void main(String[] args) {
// var strs = List.of("abc");
var dividedStrings = Stream.of("foo", "hello", "bar", "world")
.collect(Collectors.teeing(
Collectors.filtering((String s) -> s.length() <= 3, Collectors.toList()),
Collectors.filtering((String s) -> s.length() > 3, Collectors.toList()),
List::of
));
System.out.println(dividedStrings);
}
private static class Employee {
boolean isActive;
public Employee(boolean isActive) {
this.isActive = isActive;
}
public boolean isActive() {
return isActive;
}
@Override
public String toString() {
return "Employee{" +
"isActive=" + isActive +
'}';
}
}
private static class MaxMin {
int max;
int min;
MaxMin(int max, int min) {
this.max = max;
this.min = min;
}
@Override
public String toString() {
return "MaxMin{" +
"max=" + max +
", min=" + min +
'}';
}
}
}
如果我使用 java src/TeeingCollector.java 从终端执行该类
我收到以下错误:
src/TeeingCollector.java:14: error: incompatible types: inferred type does not conform to equality constraint(s)
.collect(Collectors.teeing(
^
inferred: List<String>
equality constraints(s): List<Object>,R
where R,T,A are type-variables:
R extends Object declared in method <T,A,R>filtering(Predicate<? super T>,Collector<? super T,A,R>)
T extends Object declared in method <T,A,R>filtering(Predicate<? super T>,Collector<? super T,A,R>)
A extends Object declared in method <T,A,R>filtering(Predicate<? super T>,Collector<? super T,A,R>)
1 error
error: compilation failed
如果我取消注释 var strs = List.of("abc"); 行,那么代码将毫无问题地执行。
Java 版本(适用于 macOS):
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode, sharing)
使用以下版本(旧)运行相同的代码不会产生错误
OpenJDK Runtime Environment (build 12-ea+23)
OpenJDK 64-Bit Server VM (build 12-ea+23, mixed mode, sharing)
注意:如果我编译它然后运行,我对 macOS 的两个构建都没有任何错误,所以似乎只有 java TeeingCollector.java 不能正常工作
【问题讨论】:
-
Employee和MaxMin类是否相关? -
@AndyTurner
Employee和MaxMin未使用,但如果我删除它们,我将无法重现错误 -
我无法重现,该程序在这两种情况下都适用于我。我也在使用 JDK 12 的 build 33。
-
我可以在 mac 上重现
build 12+33,但我不明白取消注释var strs = List.of("abc");如何使它在您的情况下编译;或者您可以全部编译:使用javac也失败了。您确定您在此处提供的示例吗?