integration/abstraction 兼容抽象接口(abstraction)

覆盖范围

appeng.integration.abstraction 包,17 个 .java 文件 —— 全部是接口。

实测:find integration/abstraction -name '*.java' | wc -l = 17。

这层存在的唯一理由:跨 mod 调用不带类型依赖

AE2 的核心代码不 import 任何外部 mod 的类。所有跨 mod 调用都写成 IntegrationRegistry.INSTANCE.getInstance(IFoo.class),由 abstraction/ 的接口描述「AE2 需要对方做什么」, 再由 modules/ 的实现把接口方法转发到对方的真实 API。

AE2 核心            appeng.core / appeng.tile / appeng.parts …
   │  不知道 IC2 / GT / BC 是什么
   ▼
abstraction/IIC2     appeng/integration/abstraction/IIC2.java:16
   │  只有方法签名,全是 AE2 / MC 的类型
   ▼
modules/IC2          appeng/integration/modules/IC2.java:22
   │  implements IIC2, IIntegrationModule
   ▼
ic2.api.*            真正的外部 API

⚠️ 因此 abstraction/ 里的接口只用 net.minecraft.* 与 appeng.api.* 的类型(ItemStack / TileEntity / EntityPlayer / ForgeDirection / Item)。外部类型一律用 Object 或注解 @Nullable 表达。

17 个接口全表

方法数用「去注释后按 Type name(args); 形态统计」得出(含重载)。

接口 声明行 行数 方法数 有同名模块实现?
IBetterStorage.java 17 22 2 ✅ modules/BetterStorage
IBuildCraftCore.java 29 59 3 ✅ modules/BuildCraftCore
IBuildCraftTransport.java 35 101 8 ✅ modules/BuildCraftTransport
IDSU.java 17 22 2 ✅ modules/DSU
IFMP.java 20 29 4 ✅ modules/FMP
IFZ.java 18 35 8 ✅ modules/FZ
IForestry.java 15 18 1 ❌ 无实现
IGT.java 17 24 3 ✅ modules/GT
IIC2.java 16 25 4 ✅ modules/IC2
IImmibisMicroblocks.java 18 27 2 ✅ modules/ImmibisMicroblocks
IInvTweaks.java 15 18 1 ✅ modules/InvTweaks
ILP.java 20 39 9 ❌ 无实现
IMekanism.java 15 20 2 ✅ modules/Mekanism
INEI.java 16 21 2 ✅ modules/NEI
IRC.java 15 18 1 ✅ modules/RC(但 RC 是空壳)
ITE.java 17 26 4 ❌ 无实现
IThaumicTinkerer.java 5 10 2 ✅ modules/ThaumicTinkerer(但 TT 是空壳)

方法数合计 58(含重载,如 IBuildCraftTransport.createFacadePart ×2、 IFZ / ILP 里的多处同名前缀方法)。

计数陷阱

⚠️ 用「返回类型在固定白名单里」的正则统计会严重少算: 本层大量方法返回接口类型而非基本类型,例如

接口 返回类型 会被漏掉
IDSU IMEInventory getDSU(:19)
IFMP IPartHost / CableBusContainer / Event getOrCreateHost(:22)、getCableContainer(:24)、newFMPPacketEvent(:28)
IForestry IItemComparisonProvider getGeneticsComparisonProvider
ILP List<ItemStack> / IMEInventory 4 个方法
IBetterStorage InventoryAdaptor getAdaptor
INEI RenderItem setItemRender

按白名单统计会把 IDSU 记成 1(实为 2)、IFMP 记成 1(实为 4)、 IForestry 记成 0(实为 1)。

三个死接口:IForestry / ILP / ITE

这 3 个接口没有对应的 IntegrationType 常量,也没有对应的模块类:

接口 声明行 方法数 内容 状态
IForestry 15 1 IItemComparisonProvider getGeneticsComparisonProvider 死代码(Forestry)
ILP 20 9 物流管道请求 / 能量 死代码(Logistics Pipes)
ITE 17 4 粉碎机配方 / 管道 死代码(Thermal Expansion)

⚠️ IForestry 不是空接口 —— 它有 1 个方法 getGeneticsComparisonProvider(返回 IItemComparisonProvider)。 IntegrationType 里没有 Forestry 常量。

已用 grep -rn 确认:ASMIntegration.java:56-62 的注释块里提到过 IntegrationType.TE / IntegrationType.LP / IntegrationType.Forestry / IntegrationType.UE / IntegrationType.Mystcraft / IntegrationType.gregtech_addon —— 但全部是注释掉的 (ASMIntegration.java:53 注释原文: // These are kept so we don't have to search through git for stuff like this)。

接口方法数 ≠ IntegrationType 数量 ≠ 模块数

项 数
abstraction/ 接口文件 17
abstraction/ 方法声明 58
modules/ 模块类 25
IntegrationType 常量 27

四个数字互不相等。25 个模块里只有 15 个实现 abstraction 接口 (Chisel / CoFHWrench / FMP 实现 IFMP / Jabba / MFR / OpenComputers / PneumaticCraft / RF / RFItem / Waila / BuildCraftBuilder / NEI 额外实现 IContainerTooltipHandler 与 IContainerObjectHandler)。

反向:IntegrationType 的 27 个里 12 个没有 abstraction 接口。

方法语义分类

类别 例子 涉及接口数
配方注入 IIC2.maceratorRecipe、IFZ.grinderRecipe、IRC.rockCrusher、IMekanism.addCrusherRecipe / addEnrichmentChamberRecipe、ITE.addPulverizerRecipe ×2 5
物品 / 容器读取 IIC2.getItem、IFZ.barrelGetItem / barrelGetMaxItemCount / barrelGetItemCount、ILP.getCraftedItems / getProvidedItems / getInv、IDSU.getDSU、IFZ.getFactorizationBarrel、IBetterStorage.getAdaptor 6
方块 / 物品判定 IDSU.isDSU、IFZ.isBarrel、IGT.isGTMachine、IBuildCraftTransport.isPipe、IBuildCraftCore.isWrench、IBuildCraftTransport.isFacade、IBetterStorage.isStorageCrate、ILP.isRequestPipe / isPowerSource 8
写操作 IFZ.setItemType / barrelSetCount、IGT.removeColor、IBuildCraftCore.wrenchUsed、IBuildCraftTransport.addItemsToPipe / createFacadePart ×2、ITE.addItemsToPipe、ILP.performRequest / useEnergy 7
能量网 IIC2.addToEnergyNet / removeFromEnergyNet、ILP.getGetPowerPipe / canUseEnergy、IGT.getGTMachineHash 3
外观 / 渲染 IBuildCraftTransport.getTextureForFacade / getCobbleStructurePipeTexture、INEI.drawSlot / setItemRender、IInvTweaks.compareItems、ILP.getCraftedItems 3
注册转发 / 事件 IFMP.registerPassThrough / newFMPPacketEvent / getOrCreateHost / getCableContainer、IImmibisMicroblocks.getOrCreateHost 2

INEI 只有 2 个方法 —— 其余全走反射

INEI.java:18 void drawSlot(Slot s) + INEI.java:20 RenderItem setItemRender(...)。

这说明 NEI 兼容的绝大部分逻辑不走这个接口, 而是 modules/NEI.java:101-173 在构造期用反射探测 NEI API, init()(:122)再用 getDeclaredMethod + invoke 注册。 见 nei-helpers 总览。

相关条目

三个死接口:IForestry / ILP / ITE

这 3 个接口没有对应的 IntegrationType 常量,也没有对应的模块类:

接口 声明 方法数 状态
IForestry IForestry.java:15 0 个方法 —— 空接口 纯占位
ILP ILP.java:20 5 死代码(Logistics Pipes)
ITE ITE.java:17 4 死代码(Thermal Expansion)

已用 grep -rn 确认:IntegrationType 里没有 LP / TE / Forestry 常量 (ASMIntegration.java:56-62 的注释里提到过 IntegrationType.TE、 IntegrationType.LP、IntegrationType.Forestry,但那些都是注释掉的)。

IForestry 是完全空的接口(18 行全是注释与包声明,零方法声明)。

接口方法数不等于 IntegrationType 数量

项 数
abstraction/ 接口文件 17
modules/ 模块类 25
IntegrationType 常量 27
三个数字互不相等

25 个模块里只有 15 个实现 abstraction 接口。其余 10 个 (Chisel / CoFHWrench / DSU 的 helpers / FMP 的部分 / Jabba / MFR / NEI 额外实现 IContainerTooltipHandler / PneumaticCraft / RF / RFItem / Waila) 直接在 init() / postInit() 里调 AEApi,不需要抽象接口。

反向:IntegrationType 的 27 个里有 12 个 (BuildCraftBuilder / CraftGuide / DSU 的 IDSU 之外的部分 / OpenComputers / PneumaticCraft / RF / RFItem / CoFHWrench / Chisel / Waila / MFR / Jabba)没有 abstraction 接口。

方法语义分类

类别 例子 出现在
配方注入 IIC2.maceratorRecipe(:24)、IFZ.grinderRecipe(:34)、IRC.rockCrusher(:17)、IMekanism.addCrusherRecipe(:17)、ITE.addPulverizerRecipe(:19/:21) 5 个接口
物品查询 IIC2.getItem(:22)、IFZ.barrelGetItem(:20)、ITE.addItemsToPipe(:25) 3 个
方块判定 IDSU.isDSU(:21)、IFZ.isBarrel(:32)、IGT.isGTMachine(:19)、IBuildCraftTransport.isPipe(:80)、IBuildCraftCore.isWrench(:35) 5 个
动作回调 IBuildCraftCore.canWrench(:47)/ wrenchUsed(:58)、IFZ.setItemType(:26)/ barrelSetCount(:28) 2 个
能量网 IIC2.addToEnergyNet(:18)/ removeFromEnergyNet(:20)、ILP.getGetPowerPipe(:32)/useEnergy(:38) 2 个
外观 IBuildCraftTransport.isFacade(:41)/ getTextureForFacade(:66)、INEI.drawSlot(:18)、IInvTweaks.compareItems(:17) 3 个
注册转发 IFMP.registerPassThrough(:26)、IImmibisMicroblocks.leaveParts(:26) 2 个

特别注意:INEI 只有一个方法

INEI.java:18 只有 void drawSlot(Slot s) —— 在槽位上画东西。 这说明 NEI 兼容的绝大部分逻辑不走这个接口, 而是 modules/NEI.java:122-155 直接用反射调 NEI 的私有 API (getDeclaredMethod("registerRecipeHandler", ...) 等)。 见 nei-helpers 总览。

相关条目