java在forge modding中“不能在定义字段之前引用它”

w9apscun  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(263)

简短问题:如何解决我的forge mod代码中的两个错误?
长问题/所需信息:
我正在创建一个锻造模型,扩展了钻石可以做什么,但我遇到了一个问题时,使一个“块项目”,这是一个库存块表示。我使用的forge mdk是 forge-1.15.2-31.2.0-mdk .
在下面代码的第32行,我得到两个错误。
第一个是给 new BlockItemBase() ,错误为 The constructor BlockItemBase(Item) is undefined. 有两个“快速修复”,但当我尝试它们时,它会导致另一个类中的另一个错误。
第二个是给 CONCENTRATED_DIAMOND_BLOCK_ITEM . 错误是 Cannot reference a field before it is defined. 这里没有任何快速解决方法。
如果有帮助的话,我使用的是EclipseIDE,这两个错误都被归类为“java错误”。我不确定是否有其他新的forge开发人员遇到这个问题,但我找不到任何解决这个问题的方法。最后,如果你需要更多的信息,请告诉我。
代码:

package pw.AbyssStudios.ExtenDiamonds.util;

import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import pw.AbyssStudios.ExtenDiamonds.ExtenDiamonds;
import pw.AbyssStudios.ExtenDiamonds.blocks.BlockItemBase;
import pw.AbyssStudios.ExtenDiamonds.blocks.ConcentratedDiamondBlock;
import pw.AbyssStudios.ExtenDiamonds.items.ItemBase;

public class RegistryHandler {

    public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, ExtenDiamonds.MOD_ID);
    public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, ExtenDiamonds.MOD_ID);

    public static void init() {

        ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
        BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
    }

    //ITEMS
    public static final RegistryObject<Item> DIAMOND_APPLE = ITEMS.register("diamond_apple", ItemBase::new);

    //BLOCKS
    public static final RegistryObject<Block> CONCENTRATED_DIAMOND_BLOCK = BLOCKS.register("concentrated_diamond_block", ConcentratedDiamondBlock::new);

    //BLOCKITEMS
    public static final RegistryObject<Item> CONCENTRATED_DIAMOND_BLOCK_ITEM = ITEMS.register("concentrated_diamond_block", () -> new BlockItemBase(CONCENTRATED_DIAMOND_BLOCK_ITEM.get())); //THIS IS WHERE THE ERROR IS
}
qzlgjiam

qzlgjiam1#

为了创造 CONCENTRATED_DIAMOND_BLOCK_ITEM ,您需要的示例 BlockItemBase ,这需要 CONCENTRATED_DIAMOND_BLOCK_ITEM . 这是一个循环引用。供应商指向一个不存在的参考

public static final RegistryObject<Item> CONCENTRATED_DIAMOND_BLOCK_ITEM = 
     ITEMS.register("concentrated_diamond_block",
     () -> new BlockItemBase(/*here you cannot use reference to CONCENTRATED_DIAMOND_BLOCK_ITEM */));

因为您在lambda表达式内部使用引用,所以该引用必须是final,所以这里需要找到另一种方法来创建 BlockItemBase 供应商。

相关问题