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 总览。