Должен квалифицировать выделение с помощью экземпляра типа GeoLocation
Я получаю эту ошибку as-
Доступный экземпляр типа GeoLocation недоступен. Должен квалифицировать выделение с помощью экземпляра типа GeoLocation (например, x.new A(), где x является экземпляром GeoLocation). Эта ошибка возникает в новой 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);
}
}
}
Ответы
Ответ 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
Сделайте эту структуру:
FILE 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 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
Когда вы создадите класс класса Stack в статический класс 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;
}
}
}
Ответ 6
Вам нужно создать экземпляр родительского класса, чтобы создать экземпляры ваших внутренних классов. Вот пример:
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);
}
}
}