IntelliJ不会推断Stream.collect()类型的结果

时间:2015-04-13 14:03:55

标签: 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());
}

该错误发生在return声明中,并表示预计会List<String>,但collect()方法会产生List<Object>。 看起来Netbeans能够理解,当IntelliJ不是Stream<String>时必须收集List<String>

The error

这里的问题是什么?

编辑:正如所建议的那样,我将IntelliJ升级到最新版本(14.1.1),我尝试用终端的javac编译我的代码:它可以工作。问题必须在我的IntelliJ配置中,但它对我来说是正确的

4 个答案:

答案 0 :(得分:2)

为什么要手动创建List<String>? &#34;它有一个API。&#34; ; - )

根据您的需要修改代码段。

Path path = Paths.get("src", file);
Charset charset = Charset.defaultCharset();
List<String> lines = Files.readAllLines(path, charset);

修改

查看toList()方法的签名。我相信它与那个相关联。

如果它像

那样
private static List<Object> toList() {
    return null;
}

您在IntelliJ中收到了您发布的错误消息:Collector<? super String,Object,List<String>> in Stream cannot be applied to ListObject>。类似于Netbeans。

如果它像

那样
static <T> Collector<T,?,List<T>> toList() {
    return null;
}

你在IntelliJ中遇到错误required: List<String> found: List<Object。而在Netbeans中它编译。<​​/ p>

如果它像

那样
static Collector<? super String, Object, List<String>> toList() {
    return null;
}

你没有收到错误。

正如已经提到的,#s以某种方式链接到你的toLoist()。知道new Collector(T, A, R)的类型参数会很有趣。

答案 1 :(得分:2)

您可以使用显式类型参数帮助编译器:

return lines.collect(Collectors.<String>toList());

之前的情况确实如此,但是现在为改进编译器的类型推断所做的工作应该使这个类型参数变得不必要。

据我所知,IntelliJ在幕后使用javac,因此编译错误有点奇怪。

还可以尝试使用javac直接在命令行中编译文件,看看是否有相同的错误。

如果是,请尽快升级javac。如果没有,那么IntelliJ配置肯定存在问题。您还可以将IntelliJ升级到最新的14.1.1版本。

答案 2 :(得分:1)

我解开了这个谜团:在File Menu->Project Structure中,将Project Language Level更改为8.0 - Lambdas, type annotations etc.

答案 3 :(得分:0)

可能是你的IntelliJ没有正确设置Java 1.8吗?

Set the JDK for IntelliJ。它可能指向较旧的Java版本