亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > Java > java教程 > 正文

解決 Java 密封類 permits 子句中的泛型編譯問題

花韻仙語
發(fā)布: 2025-10-13 11:06:06
原創(chuàng)
266人瀏覽過

解決 Java 密封類 permits 子句中的泛型編譯問題

本文旨在解決 java 密封類 (sealed class) `permits` 子句中涉及泛型類型參數(shù)導(dǎo)致的編譯錯誤。核心問題在于 `permits` 子句要求列出的是類型名稱 (typename),而非包含泛型參數(shù)的類類型 (classtype)。文章將詳細解釋這一規(guī)范,提供正確的代碼示例,并闡述不同 java 編譯器 (如 `javac` 和 `ecj`) 在處理此語法時的差異,幫助開發(fā)者避免和解決相關(guān)編譯問題。

深入理解 Java 密封類與 permits 子句

Java 17 引入的密封類(Sealed Class)特性允許開發(fā)者對類的繼承或接口的實現(xiàn)進行更嚴格的控制。通過 sealed 關(guān)鍵字,一個類或接口可以聲明其允許被哪些特定的子類或?qū)崿F(xiàn)類繼承或?qū)崿F(xiàn)。這些被允許的子類或?qū)崿F(xiàn)類必須在 permits 子句中明確列出。

permits 子句的語法旨在提供一個清晰的、可枚舉的列表,表明哪些類型是密封類或接口的直接已知子類。然而,在使用泛型時,開發(fā)者可能會遇到一個常見的編譯陷阱。

泛型與 permits 子句的編譯錯誤

當密封類本身是泛型類,并且其允許的子類也是泛型時,直觀上可能會認為需要在 permits 子句中包含泛型類型參數(shù)。例如,考慮以下結(jié)構(gòu):

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> {
        // ...
    }
}

public sealed abstract class ADir permits ADir.Wildcard, ADir.Dir {
    public final class Wildcard extends ADir {}
    public final class Dir extends ADir {}
}
登錄后復(fù)制

在這種情況下,Maven 使用 javac 編譯器進行編譯時,會報告一系列錯誤,其中第一個錯誤通常指向 permits 子句中泛型類型參數(shù)的位置,例如:

立即學(xué)習(xí)Java免費學(xué)習(xí)筆記(深入)”;

[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
登錄后復(fù)制

這些錯誤信息看起來可能令人困惑,但其根本原因在于 permits 子句對泛型參數(shù)的語法要求與 extends 或 implements 子句不同。

permits 子句的正確泛型使用規(guī)范

根據(jù) Java 語言規(guī)范(JLS),permits 子句中列出的是類型名稱 (TypeName),而不是類類型 (ClassType)。這意味著在 permits 子句中,我們應(yīng)該只使用類的簡單名稱或完全限定名,而不應(yīng)包含任何泛型類型參數(shù)。

  • TypeName (類型名稱):指類的簡單名稱,例如 APath.LastWildcard。
  • ClassType (類類型):指包含泛型類型參數(shù)的類名稱,例如 APath<R>.LastWildcard<R>。

因此,即使 APath 及其子類 LastWildcard 和 WholeWildcard 都是泛型類型,在 permits 子句中也必須省略泛型參數(shù)。

AI封面生成器
AI封面生成器

專業(yè)的AI封面生成工具,支持小紅書、公眾號、小說、紅包、視頻封面等多種類型,一鍵生成高質(zhì)量封面圖片。

AI封面生成器108
查看詳情 AI封面生成器

正確的代碼示例:

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> {
        // ...
    }
}
登錄后復(fù)制

通過移除 permits 子句中的泛型類型參數(shù) (<R> 和 <R1>),代碼將符合 Java 語言規(guī)范,并能順利通過 javac 編譯。

編譯器差異:javac 與 ecj

在開發(fā)過程中,您可能會發(fā)現(xiàn)某些集成開發(fā)環(huán)境(IDE),如 Eclipse 或基于 Eclipse LSP 的 VSCode Java 插件,并不會立即報告上述錯誤。這通常是因為這些 IDE 使用了不同的 Java 編譯器。

  • javac:這是 Oracle JDK 或 OpenJDK 提供的標準 Java 編譯器,也是 Maven 在構(gòu)建項目時默認使用的編譯器。它嚴格遵循 Java 語言規(guī)范。
  • ecj (Eclipse Compiler for Java):這是 Eclipse IDE 內(nèi)部使用的編譯器。ecj 有時會比 javac 更寬松,或者在某些新語言特性的實現(xiàn)上可能存在差異,導(dǎo)致它在某些情況下不會報告 javac 會報告的錯誤。

這種編譯器行為上的差異解釋了為什么在 IDE 中代碼看起來沒有問題,但在使用 Maven 構(gòu)建時卻出現(xiàn)編譯錯誤。因此,始終以 javac 的行為為準,并確保代碼嚴格符合 Java 語言規(guī)范,是保證項目可移植性和正確性的最佳實踐。

總結(jié)與注意事項

  1. permits 子句只接受類型名稱:在 Java 密封類的 permits 子句中,只允許列出允許的子類的簡單名稱或完全限定名,不得包含泛型類型參數(shù)。
  2. 遵循 Java 語言規(guī)范:即使 IDE 沒有報錯,也應(yīng)始終參考 Java 語言規(guī)范來編寫代碼,尤其是在使用新語言特性時。
  3. 以 javac 編譯結(jié)果為準:在項目構(gòu)建時,通常會使用 javac 進行編譯。因此,javac 的編譯結(jié)果才是最終的權(quán)威。

通過理解 permits 子句的精確語法要求以及不同編譯器之間的潛在差異,開發(fā)者可以更有效地使用 Java 密封類,避免常見的編譯錯誤,并構(gòu)建出健壯、符合規(guī)范的 Java 應(yīng)用程序。

以上就是解決 Java 密封類 permits 子句中的泛型編譯問題的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號