【问题标题】:Nested generics compilation error with mavenmaven的嵌套泛型编译错误
【发布时间】:2022-11-20 03:59:54
【问题描述】:

我有一个抽象类(幻像类型)和 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。请提供任何提示和假设。

【问题讨论】:

  • Eclipse 有自己的编译器(称为“ecj”)并且不使用 javac,这两个编译器偶尔会在什么是有效的问题上发生分歧——通常是泛型

标签: java eclipse maven


【解决方案1】:

类的 permits 子句是类型名称列表而不是类类型。 (见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> {
        ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多