当前位置: 首页 > 知识库问答 >
问题:

无法访问(此处的类)的封闭实例

司马萧迟
2023-03-14

我有一个叫做GreenhouseControls的类,它有很多

内置于其中的类,例如:

public class ThermostatNight extends Event {
    public ThermostatNight(long delayTime) {
      super(delayTime);
    }
    public void action() {
      // hardware control code here.
      thermostat = "Night";
    }
    public String toString() {
      return "Thermostat on night setting";
    }
  }

我从文本文件中提取值以获取事件名称(如“ThermostatNight”)和时间值(如“2000”)。为了用这些值实例化一个新对象,我构建了一个EventFactory,它接受这些值作为参数。

这是我构建的类,用于从文本文件值创建新的事件对象:

    public class EventFactory{

        public static Event createSpecificEvent(String eventName, long delayTime) {

            Event event = null;

            switch(eventName) {
            case "ThermostatNight": 
                event = new ThermostatNight(delayTime); // Compiler error
                break;
            case "ThermostatDay": 
                event = new ThermostatDay(delayTime);
                break;
            case "LightOn": 
                event = new LightOn(delayTime);
                break;
            case "LightOff": 
                event = new LightOff(delayTime);
                break;
                ...
        }
}

当我运行这个程序时,一切都运行得很好,直到我将EventFactory类从GreenHouse控件中拉出来并放入它自己的独立类。现在我得到一个编译时错误,它说:

“无法访问GreenhouseControls类型的封闭实例。必须使用GreenhouseControls类型的封闭实例限定分配(例如,x.new A(),其中x是GreenhouseControls的实例)。”

请参阅EventFactory类中的联机注释,以查看“new ThermostatNight(delayTime)”中发生错误的位置

共有1个答案

许嘉福
2023-03-14

您的类目前是内部类,需要在包含类的实例的上下文中构建。您的选择是:

  • 在构造内部类的实例时指定外部类的实例
  • 将嵌套类声明静态类类,此时它们不再是内部类
  • 将嵌套类移出包含类,使其成为顶级类

就我个人而言,如果可能的话,我会选择最后一个选项——嵌套类有时是有用的,但只有在真正有好处的时候才应该使用它们。存在各种各样的限制,这些限制可能非常微妙,如果可能,最好避免。您是否有任何令人信服的理由来创建这些嵌套类?

 类似资料:
  • 我想让具有多个内部类的抽象类对其进行扩展,并可以通过静态方法创建其内部类的实例,但我得到编译器错误“无法访问ITask类型的封闭实例。必须使用ITask类型的封闭实例限定分配(例如,x.new A(),其中x是ITask的实例)。” 我发现内部类应该由外部类的实例创建,但是我的外部类有抽象方法,我不能创建它的实例。我创建了扩展父类的内部类,因为我习惯于控制它们的创建。那么有没有办法让我的模式发挥作

  • 我有以下代码: 我知道什么都不做,但我的Hello,World程序没有它也可以编译。只有我定义的类在我身上失败了。 它拒绝编译。我得到在创建新事物的行中。我猜: 我有系统级问题(在DrJava或我的Java安装中)或 我对如何用java构建工作程序有一些基本的误解 有什么想法吗?

  • 问题内容: 我有以下代码: 我知道什么Thing也没做,但是没有它我的Hello,World程序就可以编译。只有我定义的类对我不利。 并且它拒绝编译。我到达创建新事物的路线。我猜是: 我有系统级别的问题(在DrJava或Java安装中)或 我对如何在Java中构建工作程序有一些基本的误解。 问题答案: 将使你的程序正常运行。 实际上,你已经拥有一个内部类,该内部类(根据定义)与的特定实例相关联(即

  • 当我试图在Eclipse中编译/启动我的程序时,我得到了一个错误

  • 整个守则是: 为什么会出现以下代码段: 导致以下错误: 无法访问ThreadLocalTest类型的封闭实例。必须使用ThreadLocalTest类型的封闭实例限定分配(例如,x.new A(),其中x是ThreadLocalTest的实例)。 核心问题是:我想在静态方法中初始化内部类。这里有两种解决方案: > 使用外部引用,如:

  • 问题内容: 出于教育目的,我尝试制作一个服务器和一个客户端,其中服务器从多个客户端接收数据并回显每条消息。问题是,当我尝试让服务器一次将回显发送到所有客户端时。 我搜寻并回答了许多类似的问题,但是没有一个对我有帮助。希望你能指出我的错误。提前致谢。 问题答案: 您的嵌套类需要外部类的一个实例,因为它不是静态的-但你不 具备 外部类的一个实例。 尝试制作两个嵌套类。看起来他们无论如何都不 需要 引用