Tahsisi, GeoLocation türünün çevreleyen bir örneği ile nitelendirmelidir


109

Bu hatayı şu şekilde alıyorum:

GeoLocation türünün kapsayıcı bir örneğine erişilemez. Tahsisi, GeoLocation türünün çevreleyen bir örneğiyle nitelemelidir (egxnew A () burada x, GeoLocation örneğidir). Bu hata yeni ThreadTask (i) ' de geliyor . Neden olduğunu bilmiyorum. Herhangi bir öneri takdir edilecektir.

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

}


Olası Java
Raedwald

Yanıtlar:


150

Merhaba bunun için bir çözüm buldum ;-)

Bu hata service.submit(new ThreadTask(i)); , ana sınıfın örneğini oluşturmadan iç sınıfın bir örneğini oluşturmaya çalıştığınız için oluşur .

Bu sorunu çözmek için lütfen önce ana sınıfın örneğini oluşturun:

GeoLocation outer = new GeoLocation();

Ardından, aşağıdaki gibi çağırmak istediğiniz sınıfın örneğini oluşturun:

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

Umarım bu, sorununuzu çözer ;-)


101

Başka bir seçenek ve tercih ettiğim seçenek, iç sınıfı statik olacak şekilde ayarlamak olacaktır.

public static class ThreadTask implements Runnable { ... }

Benim için de mükemmel çalıştı. Bence bu tercih edilen çözüm olmalı çünkü 1) En basit olanı ve 2) Ana yöntem statik.
Alan

15

Satır içi sınıfı yapın static.

public class OuterClass {

    static class InnerClass {
    }

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

Daha sonra iç sınıfı aşağıdaki gibi başlatabilirsiniz:

new OuterClass.InnerClass();

3

Bu Yapıyı Yapın:

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

}

Dosya 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
SO'ya hoş geldiniz, burada, çözümünüzü neden kullanacağınızı açıklamak iyi bir uygulamadır, sadece nasıl yapılacağını değil. Bu, cevabınızı daha değerli hale getirecek ve daha fazla okuyucunun bunu nasıl yaptığınızı daha iyi anlamasına yardımcı olacaktır. Ayrıca SSS bölümümüze göz atmanızı öneririm: stackoverflow.com/faq .
ForceMagic

2

İç sınıflarınızın örneklerini oluşturmak için ana sınıfın bir örneğini oluşturmanız gerekir. İşte bir örnek:

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

Bu, statik olmayan üyelere statik yöntemlerden veya benzer şekilde erişiyorsanız da olabilir. Aşağıda, hataya neden olan ve diğer çözülmüş kod parçasına neden olan iki farklı yön bulunmaktadır. bu sadece diğerini "statik" sınıf yapmak

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;

        }

    }

}

Bu, StackArrList türünün kapsayıcı bir örneğine erişilemiyor hatasını atar . Ayırmayı, StackArrList türünün çevreleyen bir örneğiyle nitelendirmelidir (egxnew A () burada x, StackArrList'in bir örneğidir). ve Stack sınıfının örneğini oluşturmaya izin vermeyecek

Eğer yaptığınızda sınıf Stack için statik sınıf Stack cezası çalışacak ve hiçbir hata olacaktır.

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;

        }

    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.