Intellij - ไม่สามารถใช้คลาส Java 8 ที่ใหม่กว่า - ข้อผิดพลาด:“ การใช้ API ที่บันทึกเป็น @since 1.6+ .. ”


168

ฉันพยายามใช้java.lang.function.Functionในฐานรหัส java 8 ของฉัน แต่ฉันยังคงได้รับข้อผิดพลาดต่อไปนี้ใน Intellij

การใช้ API ที่บันทึกเป็น @since 1.6+ การตรวจสอบนี้จะค้นหาวิธีการทั้งหมดที่มี @since แท็กในเอกสารประกอบ สิ่งนี้อาจมีประโยชน์เมื่อทำการพัฒนาภายใต้ SDK รุ่นใหม่กว่าเป็นแพลตฟอร์มเป้าหมายสำหรับการผลิต

ฉันดูเหมือนจะมีการตั้งค่าโครงการและคอมไพเลอร์ที่ถูกต้อง

การตั้งค่าโครงการ: (ไฟล์ -> โครงสร้างโครงการ)

Project Settings -> Project -> Project SDK = Java 1.8
Project Settings -> Project -> Project Language Level = 8 - Lambdas, Type Annotations etc

การตั้งค่าคอมไพเลอร์: (ไฟล์ -> การตั้งค่า)

Build, Execution, Deployment -> Compiler -> Java Compiler -> Project Bytecode Version : 1.8
Build, Execution, Deployment -> Compiler -> Java Compiler -> Per module Bytecode Version -> Target Bytecode Version : 1.8

อะไรคือปัญหา?

คำตอบ:


365

แก้ไขคำตอบตามความคิดเห็น Bastien Jansen

ดูเหมือนว่ามีการตั้งค่าโครงการอื่นที่มีผลต่อระดับคอมไพเลอร์ ข้อบ่งชี้ที่ลึกซึ้งของปัญหานี้คือเมื่อคอมไพเลอร์ของคุณเริ่มบ่นเกี่ยวกับซอร์สจาวาและเวอร์ชันจาวาเป้าหมายที่แตกต่างจากที่คุณระบุในขณะที่คุณคอมไพล์โค้ด

Warning:java: source value 1.5 is obsolete and will be removed in a future release
Warning:java: target value 1.5 is obsolete and will be removed in a future release
Warning:java: To suppress warnings about obsolete options, use -Xlint:-options.

ในการกำจัดสิ่งนี้คุณต้องเปิดขึ้น

File -> Project Structure -> Project Settings -> Modules -> "Your Module Name" -> Sources -> Language Level

และเปลี่ยนเป็นระดับที่ต้องการเช่น 1.8 หรือระดับภาษาเริ่มต้นของโครงการ


6
ในการตั้งค่าโครงการคุณควรกำหนดค่าแต่ละโมดูลเพื่อใช้Project defaultระดับภาษา (ในSourcesแท็บ)
Bastien Jansen

@BastienJansen ขอบคุณ แก้ไขคำตอบตามความคิดเห็นของคุณ!
Nerrve

7
Project Settingsพบได้ในFile -> Project Structure
Karl

6
ทำไมสิ่งนี้จึงต้องมีการตั้งค่าในหลาย ๆ ที่จึงเกินกว่าฉัน ขอบคุณ
Richard Rast

1
การตั้งค่าโครงการนี้จะถูกเขียนทับเมื่อคุณนำเข้าอีกครั้งหากคุณใช้ Maven สิ่งนี้จะเกิดขึ้นทุกครั้งที่คุณเปลี่ยน pom และจะทำให้คุณไม่ต้องกังวลกับการตั้งค่า intellij ของคุณให้ทันสมัยอยู่เสมอ สำหรับโครงการ Maven การเปลี่ยนแปลง pom ด้านล่างจะเหมาะสมกว่า
Jay

51

หากคุณกำลังใช้ maven ให้เพิ่มบรรทัดด้านล่างในไฟล์pom.xmlการกำหนดค่าของคุณจากนั้นนำเข้าอีกครั้งหรือสร้างจาก maven

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

อื่นเลือกคอมไพเลอร์ Java และระดับภาษาจากด้านล่างเส้นทาง

ไฟล์> โครงสร้างโครงการ> การตั้งค่าโครงการ> โมดูล> ชื่อโมดูลของคุณ> แหล่งที่มา> ระดับภาษา> เลือกหนึ่งที่คุณต้องการ

ป้อนคำอธิบายรูปภาพที่นี่

เปลี่ยนระดับภาษาจากที่นี่: -

ป้อนคำอธิบายรูปภาพที่นี่


1
ขอบคุณมากสำหรับเรื่องนี้. ไม่ทราบสาเหตุที่ไม่เป็นค่าเริ่มต้น แม้แต่ในปี 2019.1.3 ซึ่งฉันใช้อยู่
eodeluga

33

ที่จริงแล้วถ้าคุณใช้ Maven และpom.xmlคุณสมบัติโครงการของคุณมีการกำหนดค่าอย่างถูกต้อง

<project xmlns="...> 
....
<properties>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
</properties>
...
</project

คุณสามารถอิมพอร์ตพารามิเตอร์ Maven ไปยังintellij-ideaโปรเจ็กต์ - คลิกขวาที่รายการรูทโปรเจ็กต์Maven -> Reimportซึ่งอยู่ด้านล่าง

รูปภาพแสดงให้เห็นว่า Maven เป็นรายการที่สองจากรายการสุดท้ายในเมนูคลิกขวาที่โครงการ


25

ฉันเพิ่งแก้ไขได้ดังนี้

คลิกขวาที่โครงการ -> เปิดการตั้งค่าโมดูล -> โมดูล -> แหล่งที่มา -> 8 หรือสูงกว่า

ป้อนคำอธิบายรูปภาพที่นี่

และจากนั้น

ป้อนคำอธิบายรูปภาพที่นี่

หากยังคงพบข้อผิดพลาดและใช้mavenคุณต้องเพิ่มการกำหนดค่าการสร้างในpom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

4

ไฟล์> การตั้งค่า> Build, Execution, Deployment> Java Compiler

เปลี่ยน Target bytecode version เป็น 1.8 ของโมดูลที่คุณใช้งานอยู่

หากคุณใช้ Maven

เพิ่มปลั๊กอินคอมไพเลอร์ใน pom.xml ภายใต้โหนดโปรเจ็กต์ระดับบนสุด:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>


1

หากคุณกำลังใช้ Gradle อย่าลืมตรวจสอบให้แน่ใจว่ามีการตั้งค่าต่อไปนี้เป็น 1.8 และไม่ใช่ 1.5 (ตัวอย่างเช่นสำหรับเหตุผลที่แปลกประหลาดบางอย่างใน Intelij ค่าเริ่มต้นคือ 1.5) ดังนั้นไม่ว่าคุณจะทำอะไรในระดับโครงการเพื่อตั้งคอมไพเลอร์ ระดับความเข้ากันได้การตั้งค่านี้จะทำให้คุณยังคงมีปัญหากับคุณสมบัติ Java 8 ที่ไม่รู้จัก:

version '1.0-SNAPSHOT'

apply plugin: 'groovy'
apply plugin: 'java'

sourceCompatibility = 1.8

1

บางทีการกำหนดค่าที่เก็บของคุณอาจมีคุณสมบัติเช่น compiler Version ตรวจสอบ settings.xmlไฟล์

<jdk>1.8</jdk>
</activation>
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>

1

มีอีกที่หนึ่งที่อาจเป็นสาเหตุของปัญหานี้ไม่ว่าคุณจะใช้ Maven หรือ Gradle หรือไม่ก็ตาม

ในSettings | Editor | Inspections | Java language level migration aids | Usages of API which isn't available at the configured language levelค่าเริ่มต้น (ฉันเชื่อว่า) ถูกตั้งค่าเป็นRespecting to project language level settingsแต่มันสามารถตั้งค่าHigher than:ซึ่งละเว้นการตั้งค่าโครงการ

หมายความว่าหากคุณทำตามคำแนะนำในคำตอบอื่น ๆ และตั้งค่าระดับภาษาของโครงการเป็น 8 พูด แต่ตั้งค่าการตรวจสอบเป็นความHigher than: 7คิดจะยังคงพอดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.