C#链表中存储对象后访问对象及方法问题(区块链Demo场景)
解决区块链Demo中链表区块无法访问的问题
嘿,我来帮你搞定这个问题!你说把创世区块存入chain链表后没法访问对象或方法,大概率是这几个常见原因导致的,咱们一个个排查:
1. 链表未使用泛型,导致取出元素为Object类型
如果你的chain定义是不带泛型的LinkedList,比如:
private LinkedList chain;
那从链表中取出的元素默认是Object类型,自然没法直接调用Block类的方法。解决办法很简单,给链表加上泛型约束:
private LinkedList<Block> chain;
这样你直接取元素的时候,比如Block firstBlock = chain.getFirst();,就能直接调用Block的方法了。要是暂时不想改泛型,那取元素的时候记得强制类型转换:
Block firstBlock = (Block) chain.getFirst();
2. Block类或其方法的访问修饰符不正确
检查下你的Block类和它的方法是不是用了private或者默认包访问权限:
- 如果
Block类是private,那外部类根本没法实例化或者访问它,得改成public; - 如果
Block里的方法是private,外部也调用不了,把需要访问的方法改成public(或者同包下用默认权限)。
举个正确的例子:
public class Block { // 属性可以是private,但提供public的getter方法 private String blockData; public Block(String data) { this.blockData = data; } // 对外暴露访问方法 public String getBlockData() { return this.blockData; } }
3. 构造函数里漏了把创世区块添加到链表的步骤
再仔细看看Blockchain的构造函数,是不是调用createGenesisBlock()后,没执行chain.add(genesisBlock)这一步?如果没添加,那chain里根本没有区块对象,肯定访问不到。正确的构造函数应该是这样:
public Blockchain() { chain = new LinkedList<>(); // 先初始化链表 Block genesis = createGenesisBlock(); chain.add(genesis); // 务必把创世区块加入链表 }
完整可运行的示例片段
给你贴个简化版的正确代码,你可以对照着调整自己的Demo:
import java.util.LinkedList; public class Blockchain { private LinkedList<Block> chain; public Blockchain() { chain = new LinkedList<>(); chain.add(createGenesisBlock()); } private Block createGenesisBlock() { return new Block(0, "创世区块", "0"); } // 提供外部访问链表区块的方法 public Block getFirstBlock() { return chain.getFirst(); } } public class Block { private int index; private String data; private String prevHash; public Block(int index, String data, String prevHash) { this.index = index; this.data = data; this.prevHash = prevHash; } public String getData() { return this.data; } } public class Program { public static void main(String[] args) { Blockchain demoChain = new Blockchain(); Block genesisBlock = demoChain.getFirstBlock(); System.out.println("创世区块内容:" + genesisBlock.getData()); // 这里就能正常访问区块对象和方法了 } }
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

