IntelliJ 2018.1中JDK10局部变量类型推断(var)无法识别问题
首先看一下你提供的代码:
public class Variations { public static void main(String[] args) { var local = "foo"; System.out.println(local); } }
这段代码本身没有语法问题,问题大概率出在IntelliJ的配置细节上。我之前用同版本IDEA和JDK10时也碰到过一模一样的情况,给你列几个必查的排查方向:
确认模块的语言级别完全同步:
有时候项目级的语言级别设成10了,但模块没跟上。操作路径:File → Project Structure → Modules,选中你的模块后切到Sources标签,把Language level改成10 - Local variable type inference。别依赖“Project default”,直接选10更稳妥,避免项目默认配置未生效的情况。检查模块的字节码编译版本:
同样在Project Structure → Modules里,切到Compiler标签,把Bytecode version设为10,或者勾选Use project bytecode version确保和项目配置一致。字节码版本不匹配的话,编译器会直接不认新语法特性。验证全局Java编译器设置:
打开File → Settings → Build, Execution, Deployment → Compiler → Java Compiler,找到你的项目模块,把Target bytecode version改成10。这里很容易被忽略,因为默认可能继承了旧版本的配置。清理IDEA缓存并重启:
IntelliJ的缓存有时候会抽风,导致配置不生效。直接点File → Invalidate Caches / Restart,选择Invalidate and Restart,等重启完再编译试试,这个操作解决过我很多奇奇怪怪的编译问题。如果是Maven/Gradle项目,检查构建工具配置:
如果你用Maven,一定要确保pom.xml里的maven-compiler-plugin设置了正确的source和target版本——Maven的配置会直接覆盖IntelliJ的项目设置:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>10</source> <target>10</target> </configuration> </plugin> </plugins> </build>Gradle项目则要在
build.gradle里设置:sourceCompatibility = 10 targetCompatibility = 10最后再确认JDK配置:
去File → Project Structure → SDKs,检查你添加的JDK10路径是否正确,有没有不小心选成JDK8或者其他版本。有时候IDEA会自动识别旧JDK,导致配置串了。
按上面的步骤挨个排查,应该就能解决问题了!
内容的提问来源于stack exchange,提问作者Zalán Meggyesi

