【发布时间】:2017-11-25 19:30:02
【问题描述】:
以下编译失败:
@NotNull String defaultFormatter(@Nullable Object value) {
if (value instanceof Collection) {
return ((Collection) value).stream()
.map(MyClass::defaultFormatter)
.collect(Collectors.joining(eol));
}
return String.valueOf(value);
}
尤其是使用 javac 编译时,错误会是:
Error:(809, 94) java: incompatible types:
java.lang.Object cannot be converted to
@org.jetbrains.annotations.NotNull java.lang.String
但是下面的编译就好了:
@NotNull String defaultFormatter(@Nullable Object value) {
if (value instanceof Collection) {
Stream<String> stream = ((Collection) value).stream()
.map(MyClass::defaultFormatter);
return stream.collect(Collectors.joining(eol));
}
return String.valueOf(value);
}
唯一的区别是我引入了一个额外的变量。请注意,我没有强制转换,所以没有语义变化。
谁能解释为什么需要这样做?
【问题讨论】:
-
您使用的是
javac还是IDE 的编译器? -
IntelliJ IDEA 的语法高亮,并通过 javac 编译确认。
-
stackoverflow.com/questions/2770321/… 的可能重复项。请参阅“原始类型是该类型的擦除”下的部分。您需要使用
Collection<?>而不是Collection。 -
由于unchecked conversion,该作业有效。基本上任何
AnObject<T> = AnObject或AnObject = AnObject<T>形式的赋值都是有效的,原因是向后兼容旧库。 -
@ddimitrov 鼓励 Radiodef 将其写成答案。并在一些脾气暴躁的灵魂带着欺骗锤出现并将其标记为“什么是原始类型”的欺骗之前做到这一点。
标签: java generics java-stream inferred-type