必须使用 GeoLocation 类型的封闭实例来限定分配

Posted

技术标签:

【中文标题】必须使用 GeoLocation 类型的封闭实例来限定分配【英文标题】:Must qualify the allocation with an enclosing instance of type GeoLocation 【发布时间】:2012-03-16 21:17:29 【问题描述】:

我收到此错误 -

无法访问 GeoLocation 类型的封闭实例。(例如 x.new A(),其中 x 是 GeoLocation 的一个实例)。此错误即将出现 new ThreadTask(i) 。我不知道为什么会这样。任何建议将不胜感激。

public class GeoLocation 
    public static void main(String[] args) throws InterruptedException 
        int size = 10;

        // create thread pool with given size
        ExecutorService service = Executors.newFixedThreadPool(size); 

        // queue some tasks
        for(int i = 0; i < 3 * size; i++) 
            service.submit(new ThreadTask(i));
        

        // wait for termination        
        service.shutdown();
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
    

    class ThreadTask implements Runnable 
        private int id;

        public ThreadTask(int id) 
            this.id = id;
        

        public void run() 
            System.out.println("I am task " + id);
        
    


【问题讨论】:

看到这个答案:***.com/questions/633585/… Java - No enclosing instance of type Foo is accessible的可能重复 【参考方案1】:

发生此错误是因为您尝试创建内部类 service.submit(new ThreadTask(i)); 的实例 没有创建主类的实例..

要解决这个问题,请先创建主类的实例:

GeoLocation outer = new GeoLocation();

然后创建您要调用的类的实例,如下所示:

service.submit(outer.new ThreadTask(i));

【讨论】:

【参考方案2】:

另一种选择,也是我更喜欢的选择,是将内部类设置为静态。

public static class ThreadTask implements Runnable  ... 

【讨论】:

【参考方案3】:

创建内联类static

public class OuterClass 

    static class InnerClass 
    

    public InnerClass instance = new OuterClass.InnerClass();

那么就可以如下实例化内部类:

new OuterClass.InnerClass();

【讨论】:

【参考方案4】:

做这个结构:

文件GeoLocation.java

public class GeoLocation 

    public static void main(String[] args) throws InterruptedException 

        int size = 10;

        // create thread pool with given size
        ExecutorService service = Executors.newFixedThreadPool(size); 

        // queue some tasks
        for(int i = 0; i < 3 * size; i++) 
            service.submit(new ThreadTask(i));
        

        // wait for termination        
        service.shutdown();
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
    

文件ThreadTask.java

public class ThreadTask implements Runnable 
    private int id;

    public ThreadTask(int id) 
        this.id = id;
    

    public void run() 
        System.out.println("I am task " + id);
    

【讨论】:

【参考方案5】:

您需要创建父类的实例才能创建内部类的实例。这是一个例子:

package RandomTests;

public class FinalConstructorTest 


    public static void main (String [] arg)
        FinalConstructorTest fct= new FinalConstructorTest();
        InnerClass1 f1= fct.new InnerClass1(99);
        InnerClass2 f2= fct.new InnerClass2();
    

    class InnerClass1
        private final int num2;

        protected InnerClass1(int num)
            num2= num;
            System.out.println("num2= "+ num2);
        
    
    class InnerClass2
        //private static final int x; //Doesn't work
        private final int y; 

        
            y= 5;
            System.out.println("y= "+ y);
        
    

【讨论】:

【参考方案6】:

如果您从静态方法或类似方法访问非静态成员,也可能会发生这种情况。 以下是两个不同的方面,一个是导致错误的,另一个是已解决的代码。 只需将其他设置为“静态”类即可

package Stack;

import java.util.Stack;
import java.util.*;

public class StackArrList 

    public static void main(String[] args) 


        Scanner in = new Scanner(System.in);

        Stack S = new Stack();
        System.out.println("Enter some integers and keep 0 at last:\n");
        int n = in.nextInt();

        while (n != 0) 
            S.push(n);
            n = in.nextInt();
        
        System.out.println("Numbers in reverse order:\n");

        while (!S.empty()) 

            System.out.printf("%d", S.pop());
            System.out.println("\n");

        

    

    public class Stack 
        final static int MaxStack = 100;
        final static int Value = -999999;
        int top = -1;
        int[] ST = new int[MaxStack];

        public boolean empty() 
            return top == -1;
        

        public int pop() 

            if (this.empty()) 
                return Value;
            
            int hold = ST[top];
            top--;
            return hold;
        

        public void push(int n) 
            if (top == MaxStack - 1) 
                System.out.println("\n Stack Overflow\n");
                System.exit(1);
            
            top++;
            ST[top] = n;

        

    


这会引发错误StackArrList 类型的封闭实例不可访问。必须使用 StackArrList 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 StackArrList 的实例)。并且不允许创建 Stack 类的实例

当您将 class Stack 设置为 static class Stack 时会正常工作,不会出现任何错误。

package Stack;

import java.util.Stack;
import java.util.*;

public class StackArrList 

    public static void main(String[] args) 
        Scanner in = new Scanner(System.in);

        Stack S = new Stack();
        System.out.println("Enter some integers and keep 0 at last:\n");
        int n = in.nextInt();

        while (n != 0) 
            S.push(n);
            n = in.nextInt();
        
        System.out.println("Numbers in reverse order:\n");

        while (!S.empty()) 

            System.out.printf("%d", S.pop());
            System.out.println("\n");

        

    

    static class Stack 
        final static int MaxStack = 100;
        final static int Value = -999999;
        int top = -1;
        int[] ST = new int[MaxStack];

        public boolean empty() 
            return top == -1;
        

        public int pop() 

            if (this.empty()) 
                return Value;
            
            int hold = ST[top];
            top--;
            return hold;
        

        public void push(int n) 
            if (top == MaxStack - 1) 
                System.out.println("\n Stack Overflow\n");
                System.exit(1);
            
            top++;
            ST[top] = n;

        

    


【讨论】:

以上是关于必须使用 GeoLocation 类型的封闭实例来限定分配的主要内容,如果未能解决你的问题,请参考以下文章

Cordova Geolocation有时会工作,有时则不工作

是啥导致错误“无法访问 Foo 类型的封闭实例”,我该如何解决?

当您的对象可以是实例列表时,Python 开放封闭原则?

动作必须是普通对象。使用自定义中间件进行异步操作/未定义不是对象/使用 navigator.geolocation 出现错误

JS 模块 p6

Java并发编程实例封闭