Java IntelliJ不';t推断Stream.collect()类型结果
此代码适用于Netbeans,但在IntelliJ上出现错误:Java IntelliJ不';t推断Stream.collect()类型结果,java,netbeans,intellij-idea,java-8,java-stream,Java,Netbeans,Intellij Idea,Java 8,Java Stream,此代码适用于Netbeans,但在IntelliJ上出现错误: public static List<String> readFile(String file) throws IOException { Path path = Paths.get("src", file); Stream<String> lines = Files.lines(path); return lines.collect(Collectors.toList()); } 公共静
public static List<String> readFile(String file) throws IOException {
Path path = Paths.get("src", file);
Stream<String> lines = Files.lines(path);
return lines.collect(Collectors.toList());
}
公共静态列表读取文件(字符串文件)引发IOException{
Path Path=Path.get(“src”,文件);
流行=文件。行(路径);
返回行.collect(Collectors.toList());
}
错误出现在return
语句中,表示需要List
,但collect()
方法会给出List
。
看起来Netbeans能够理解必须将流
收集到列表
,而IntelliJ则不能
这里有什么问题
编辑:正如建议的那样,我将IntelliJ升级到最新版本(14.1.1),并尝试通过terminal用javac编译代码:它可以工作。问题一定是在我的IntelliJ配置中,但在我看来似乎是正确的,可能是您的IntelliJ没有正确地使用Java 1.8进行设置
。它可能指向旧的Java版本为什么要手动创建
列表
?“它有一个API。”;-)
根据您的需要修改代码片段
Path path = Paths.get("src", file);
Charset charset = Charset.defaultCharset();
List<String> lines = Files.readAllLines(path, charset);
您将在IntelliJ中看到您发布的错误消息:
Collector您可以使用显式类型参数帮助编译器:
return lines.collect(Collectors.<String>toList());
返回行.collect(Collectors.toList());
这在以前是正确的,但是现在为改进编译器上的类型推断所做的工作应该使这个类型参数变得不必要
据我所知,IntelliJ在幕后使用javac,因此您的编译错误有点奇怪
还可以尝试直接在命令行中用javac编译文件,看看是否有相同的错误
如果是,请尽快升级javac。如果没有,那么IntelliJ配置中肯定存在问题。您还可以将IntelliJ升级到其最新的14.1.1版本。我解决了这个问题:在文件菜单->项目结构中,将项目语言级别更改为8.0-Lambdas,类型注释等。
如果IntelliJ使用的是14.0.3,请选择哪个版本,社区编辑对我来说很好,所以可能不是IntelliJ bug(我使用的版本与您相同)。您确定使用的是正确的toList()
import吗?(因为自动完成的第一个选项是创建您自己的toList方法)看这里:实际上我刚刚将IntelliJ更新到14.1.1,但我不记得有这种错误(IntelliJ使用javac)。你的Java版本是什么?如果通过提供显式类型参数来帮助编译器,会发生什么<代码>返回行.collect(Collectors.toList())代码>这是我想到的第一件事,但它看起来设置正确。如果它没有指向正确的Java版本,我猜他会在流行上出现错误。虽然这是真的,但它没有回答问题。另外,如果你想发布改进,你应该使用注释,而不是答案。确切地说:D它可以工作,但这个错误在我看来仍然很奇怪(无论如何,我会使用你的代码,谢谢;))在这种情况下,它在NetBeans中也不起作用。我怀疑toList()
来自collector
,并且是静态导入的。@次优toList()
是一个收集器,因此其返回类型与此不同(实际上方法签名类似于静态收集器toList()
)。我最初的想法是编译器无法推断正确的类型,但这是很久以前的事了,在编译器的改进完成之前。所以您的编辑不是很有用。@user2336315是对的,我使用的是静态导入:import static java.util.stream.Collectors.toList代码>我刚刚升级到14.1.1版本,问题仍然存在。我再次检查了我的配置,我正在使用javac和1.8JDK。。。这很奇怪。
static <T> Collector<T,?,List<T>> toList() {
return null;
}
static Collector<? super String, Object, List<String>> toList() {
return null;
}
return lines.collect(Collectors.<String>toList());