我有一個抽象類(幻像型別)和 2 個嵌套類(也是幻像型別)來形成 ADT:
public sealed abstract class APath<R> permits APath<R>.LastWildcard<R>, APath<R>.WholeWildcard<R> {
....
protected final List<ADir> dirs;
public final class LastWildcard<R1> extends APath<R1> {
...
}
public final class WholeWildcard<R1> extends APath<R1> {
...
}
}
并且ADir是(也是ADT):
public sealed abstract class ADir permits ADir.Wildcard, ADir.Dir {
public final class Wildcard extends ADir {}
public final class Dir extends ADir {}
}
以前ADir是一個介面,但由于這個奇怪的錯誤,我試圖將其更改為一個抽象類。因此,Eclipse 和 VSCode(據我所知,具有基于 Eclipse LSP 的適當 Java 擴展)不顯示錯誤。
但是 Maven 列印錯誤:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project prefile: Compilation failure: Compilation failure:
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[13,52] '{' expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[15,25] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[17,9] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[20,17] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[22,17] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[25,16] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[27,9] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[29,16] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[33,9] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[35,16] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[38,17] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[40,9] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[42,16] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[44,17] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[45,9] class, interface, enum, or record expected
[ERROR] /D:/Experiment/src/main/java/prefile/pref/APath.java:[47,25] class, interface, enum, or record expected
...
第一個錯誤的位置在這里:
public sealed abstract class APath<R> permits APath<R>.LastWildcard<R>, APath<R>.WholeWildcard<R>
^ HERE !!!
我pom.xml的是:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>XXX</groupId>
<artifactId>XXX</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>XXX</name>
<description>XXX</description>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<exec.mainClass>XXX</exec.mainClass>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.82</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
</plugin>
</plugins>
</build>
</project>
似乎 VSCode(和 Eclipse)(至少我這么認為 :) 使用相同的 Java(相同的 JDK)。錯誤的原因可能是什么?真的是錯誤/不受支持的語法嗎?也許17版本還不夠?我不知道TBH。請提供任何提示和假設。
uj5u.com熱心網友回復:
錯誤的原因可能是什么?真的是錯誤/不受支持的語法嗎?
是的。根據 Java 語言規范,類的 permits 子句是型別名稱串列而不是型別別(如extends/ implements)。參見JLS。型別名稱只是沒有任何泛型型別引數的類的名稱。
換句話說,洗掉泛??型型別引數:
public sealed abstract class APath<R> permits APath.LastWildcard, APath.WholeWildcard {
....
protected final List<ADir> dirs;
public final class LastWildcard<R1> extends APath<R1> {
...
}
public final class WholeWildcard<R1> extends APath<R1> {
...
}
}
如評論中所述,Eclipse(和 VSCode 插件)使用與 Maven 不同的 java 編譯器。前者使用ejc,后者使用javacJDK 本身自帶的。
這可以解釋錯誤中的差異。編譯器似乎ecj沒有正確實作語言規范的這一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/537003.html
標籤:爪哇蚀行家
