调用受保护创建方法时出现Cannot invoke createOptionsSet(int)数组类型错误
问题分析与解决方案
看起来你是把OptionSet数组对象和OptionSet类实例搞混啦,错误信息Cannot invoke createOptionsSet(int) on the array type OptionSet[]已经说得很清楚:你试图在一个数组上调用只有类实例才有的方法,而Java数组本身根本没有这个方法。
错误根源
你大概率是写出了类似这样的代码:
// 假设optionSets是你在Auto类里定义的OptionSet[]数组 optionSets.createOptionsSet(1); // 这里直接操作数组,肯定报错!
数组只是用来存储多个OptionSet实例的容器,它本身没有createOptionsSet方法——这个方法要么是Auto类的成员方法(用来创建OptionSet实例并塞进数组),要么是OptionSet类内部的方法(但得先拿到具体的OptionSet实例才能调用)。
正确实现思路
结合你说createOption方法能正常链式调用的情况,我猜你需要在Auto类里实现一个createOptionsSet方法,负责初始化OptionSet实例并添加到数组中。给你一个参考实现:
public class Auto { // 存储OptionSet的数组 private OptionSet[] optionSets; // 记录下一个可填充的数组索引 private int currentOptionSetIndex = 0; // 构造方法初始化数组容量 public Auto(int maxOptionSetCount) { optionSets = new OptionSet[maxOptionSetCount]; } // Auto类的createOptionsSet方法:创建OptionSet并加入数组 protected void createOptionsSet(int optionCapacity) { if (currentOptionSetIndex >= optionSets.length) { // 处理数组满了的情况,比如扩容或者抛出提示 throw new RuntimeException("OptionSet数组已达最大容量,无法新增"); } // 新建OptionSet实例并放入数组 optionSets[currentOptionSetIndex] = new OptionSet(optionCapacity); currentOptionSetIndex++; } // 内部的OptionSet类 protected class OptionSet { private Option[] options; private int currentOptionIndex = 0; public OptionSet(int optionMaxCount) { options = new Option[optionMaxCount]; } // OptionSet的createOption方法:创建Option并加入内部数组 protected void createOption(String optionName) { if (currentOptionIndex >= options.length) { throw new RuntimeException("当前OptionSet的Option数组已达最大容量"); } options[currentOptionIndex] = new Option(optionName); currentOptionIndex++; } // 内部的Option类 protected class Option { private String name; public Option(String name) { this.name = name; } } } }
正确调用方式
然后你就可以通过Auto实例来调用方法,实现链式操作了:
// 初始化一个最多能装5个OptionSet的Auto实例 Auto myCar = new Auto(5); // 先创建一个能装3个Option的OptionSet myCar.createOptionsSet(3); // 链式调用:拿到刚创建的OptionSet,再创建具体的Option(比如Blue、Red) myCar.optionSets[0].createOption("Blue"); myCar.optionSets[0].createOption("Red");
额外提醒
如果你的createOptionsSet本来是设计为OptionSet类的方法(比如用来初始化内部的Option数组),那你必须先获取到数组里的某个OptionSet实例,再调用它的方法——就像你成功调用createOption的方式一样,不能直接操作数组本身。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

