Phải đủ điều kiện phân bổ với một phiên bản bao quanh của loại GeoLocation


109

Tôi gặp lỗi này vì-

Không thể truy cập phiên bản kèm theo của loại GeoLocation. Phải đủ điều kiện phân bổ với một phiên bản bao quanh của loại GeoLocation (ví dụ :xnew A () trong đó x là một phiên bản của GeoLocation). Lỗi này sắp xảy ra trên ThreadTask mới (i) . Tôi không biết tại sao nó lại xảy ra. Bất kỳ đề xuất sẽ được đánh giá cao.

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);
        }
    }

}

2
Xem câu trả lời này: stackoverflow.com/questions/633585/…
hmjd

Câu trả lời:


150

Xin chào, tôi đã tìm thấy một giải pháp cho điều này ;-)

Lỗi này xảy ra vì bạn đang cố tạo một phiên bản của lớp bên trong service.submit(new ThreadTask(i)); mà không tạo phiên bản của lớp chính ..

Để giải quyết vấn đề này, trước tiên hãy tạo phiên bản của lớp chính:

GeoLocation outer = new GeoLocation();

Sau đó, tạo phiên bản của lớp bạn định gọi, như sau:

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

Tôi hy vọng điều này sẽ giải quyết vấn đề của bạn ;-)


101

Một tùy chọn khác và tôi thích hơn là đặt lớp bên trong thành tĩnh.

public static class ThreadTask implements Runnable { ... }

Làm việc hoàn hảo cho tôi quá. Tôi nghĩ rằng đây nên là giải pháp ưa thích vì 1) Nó là đơn giản nhất và 2) Phương thức chính là tĩnh.
Alan

15

Tạo lớp nội tuyến static.

public class OuterClass {

    static class InnerClass {
    }

    public InnerClass instance = new OuterClass.InnerClass();
}

Sau đó, bạn có thể khởi tạo lớp bên trong như sau:

new OuterClass.InnerClass();

3

Thực hiện cấu trúc này:

TẬP TIN 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); 
    }

}

Tập tin 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);
    }
}

4
Chào mừng bạn đến với SO, tại đây, bạn nên giải thích lý do tại sao sử dụng giải pháp của mình chứ không phải chỉ cách thức. Điều đó sẽ làm cho câu trả lời của bạn có giá trị hơn và giúp người đọc hiểu rõ hơn về cách bạn làm điều đó. Tôi cũng khuyên bạn nên xem Câu hỏi thường gặp của chúng tôi: stackoverflow.com/faq .
ForceMagic

2

Bạn cần tạo một thể hiện của lớp cha để tạo các thể hiện của các lớp bên trong của bạn. Đây là một ví dụ:

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);
        }
    }
}

1

Điều này cũng có thể xảy ra nếu bạn đang truy cập các thành viên không tĩnh từ các phương thức tĩnh hoặc tương tự. Sau đây là hai khía cạnh khác nhau, một khía cạnh gây ra lỗi và một đoạn mã đã được giải quyết khác. vấn đề chỉ là làm cho lớp khác dưới dạng "tĩnh"

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;

        }

    }

}

Điều này gây ra lỗi Không thể truy cập phiên bản kèm theo của loại StackArrList. Phải đủ điều kiện phân bổ với một phiên bản bao quanh của loại StackArrList (ví dụ :xnew A () trong đó x là một phiên bản của StackArrList). và sẽ không cho phép tạo phiên bản của lớp Stack

Khi bạn làm cho lớp Stack thành lớp tĩnh thì Stack sẽ hoạt động tốt và không có lỗi nào.

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;

        }

    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.