111 votes

Doit qualifier l'allocation avec une instance englobante de type GeoLocation.

J'obtiens cette erreur comme

Aucune instance englobante de type GeoLocation n'est accessible. Il faut qualifier l'allocation avec une instance englobante de type GeoLocation (par exemple, x.new A() où x est une instance de GeoLocation). Cette erreur apparaît sur nouveau ThreadTask(i) . Je ne sais pas pourquoi cela se produit. Toute suggestion sera appréciée.

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

}

153voto

user1528582 Points 696

Bonjour, j'ai trouvé une solution pour cela ;-)

Cette erreur se produit parce que vous essayez de créer une instance d'une classe interne. service.submit(new ThreadTask(i)); sans créer d'instance de la classe principale..

Pour résoudre ce problème, veuillez d'abord créer une instance de la classe principale :

GeoLocation outer = new GeoLocation();

Créez ensuite une instance de la classe que vous souhaitez appeler, comme suit :

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

J'espère que cela résoudra votre problème;-)

102voto

Daniel Points 3803

Une autre option, et celle que je préfère, consiste à définir la classe interne comme étant statique.

public static class ThreadTask implements Runnable { ... }

15voto

kangear Points 333

Faire la classe en ligne static .

public class OuterClass {

    static class InnerClass {
    }

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

Ensuite, vous pouvez instancier la classe interne comme suit :

new OuterClass.InnerClass();

3voto

Gene Points 398

Vous devez créer une instance de la classe mère pour pouvoir créer des instances de vos classes internes. Voici un exemple :

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

3voto

Rafael Pereira Points 21

Faites cette structure :

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

}

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X