Java 收集方法与 Checker 框架不兼容
Java collect method incompatible with Checker framework
我已经将 Checker Framework v2.1.6 引入到一个 java8 项目中并修复了所有无效性错误,但我仍然遇到以下错误
Main.java:52: error: [assignment.type.incompatible] incompatible types in assignment.
List<String> collectedStrings = strings.stream().collect(Collectors.toList());
^
found : @Initialized @NonNull List<@Initialized @Nullable Object>
required: @UnknownInitialization @Nullable List<@Initialized @NonNull String>
以下(简化的)示例代码引发错误
List<String> strings = new ArrayList<>();
strings.add("test");
List<String> collectedStrings = strings.stream().collect(Collectors.toList());
collectedStrings.forEach(System.out::println);
现在我可以通过将结果设为@Nullable
来解决这个问题
List<@Nullable String> collectedStrings = strings.stream().collect(Collectors.toList());
但这只会将错误级联到现在认为 collectedStrings 可疑的下一个调用
有人对此有好的解决方法吗?
问题是检查器框架假定 Collectors.toList()
returns 和 List<@Nullable...>
。这是一个安全、保守的假设,但在您的上下文中您需要 List<@NonNull...>
。 Checker Framework 的类型推断目前太弱,无法推断出您想要的类型。
解决问题最干净的方法是将 Collectors.toList()
更改为 Collectors.<String>toList()
。 (只写 String
等同于 @NonNull String
。)
另一种方法是取消警告,在作业中写入 @SuppressWarnings("nullness")
。
下面的代码显示了所有这些可能性。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.Nullable;
public class CollectorsToList {
void m(List<String> strings) {
Stream<String> s = strings.stream();
// This works:
List<String> collectedStrings1 = s.collect(Collectors.<String>toList());
// This works:
List<@Nullable String> collectedStrings2 = s.collect(Collectors.toList());
// This works:
@SuppressWarnings("nullness")
List<String> collectedStrings3 = s.collect(Collectors.toList());
// This assignment issues a warning due to incompatible types:
List<String> collectedStrings = s.collect(Collectors.toList());
collectedStrings.forEach(System.out::println);
}
}
我已经将 Checker Framework v2.1.6 引入到一个 java8 项目中并修复了所有无效性错误,但我仍然遇到以下错误
Main.java:52: error: [assignment.type.incompatible] incompatible types in assignment.
List<String> collectedStrings = strings.stream().collect(Collectors.toList());
^
found : @Initialized @NonNull List<@Initialized @Nullable Object>
required: @UnknownInitialization @Nullable List<@Initialized @NonNull String>
以下(简化的)示例代码引发错误
List<String> strings = new ArrayList<>();
strings.add("test");
List<String> collectedStrings = strings.stream().collect(Collectors.toList());
collectedStrings.forEach(System.out::println);
现在我可以通过将结果设为@Nullable
来解决这个问题List<@Nullable String> collectedStrings = strings.stream().collect(Collectors.toList());
但这只会将错误级联到现在认为 collectedStrings 可疑的下一个调用
有人对此有好的解决方法吗?
问题是检查器框架假定 Collectors.toList()
returns 和 List<@Nullable...>
。这是一个安全、保守的假设,但在您的上下文中您需要 List<@NonNull...>
。 Checker Framework 的类型推断目前太弱,无法推断出您想要的类型。
解决问题最干净的方法是将 Collectors.toList()
更改为 Collectors.<String>toList()
。 (只写 String
等同于 @NonNull String
。)
另一种方法是取消警告,在作业中写入 @SuppressWarnings("nullness")
。
下面的代码显示了所有这些可能性。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.Nullable;
public class CollectorsToList {
void m(List<String> strings) {
Stream<String> s = strings.stream();
// This works:
List<String> collectedStrings1 = s.collect(Collectors.<String>toList());
// This works:
List<@Nullable String> collectedStrings2 = s.collect(Collectors.toList());
// This works:
@SuppressWarnings("nullness")
List<String> collectedStrings3 = s.collect(Collectors.toList());
// This assignment issues a warning due to incompatible types:
List<String> collectedStrings = s.collect(Collectors.toList());
collectedStrings.forEach(System.out::println);
}
}