0
package com.scheduler.process;

public class Process {
    public enum state {
        NOT_SUBMITTED, SUBMITTED, BLOCKED, READY, RUNNING, COMPLETED 
    }
        private state currentState;

    public state getCurrentState() {
        return currentState;
    }

    public void setCurrentState(state currentState) {
        this.currentState = currentState;
    }

}



package com.scheduler.machine;
import com.scheduler.process.Process;
import com.scheduler.process.Process.state;

public class Machine {
    com.scheduler.process.Process p = new com.scheduler.process.Process();
    state s = state.READY;  //fails if I don't also explicitly import Process.state
    p.setCurrentState(s);  //says I need a declarator id after 's'... this is wrong.
    p.setCurrentState(state.READY);
}

修改了示例以尝试直接解决问题。我无法更改此代码的状态。Eclipse 建议导入Process.state like我之前的示例中的内容,但这也不起作用。这允许state s = state.READY但调用p.setCurrentState(s);失败p.setCurrentState(state.READY);

问题仍在继续......按照奥列格的建议,我尝试了更多排列:

package com.scheduler.machine;
import com.scheduler.process.Process;
import com.scheduler.process.Process.*;

public class Machine {
    com.scheduler.process.Process p = new com.scheduler.process.Process();
    public state s = Process.state.READY;  
    p.setCurrentState(s);
    p.setCurrentState(state.READY);
}

好的。现在很清楚我是脑叶切除术的候选人。

package com.scheduler.machine;

import com.scheduler.process.Process;
import com.scheduler.process.Process.state;

public class Machine {

    public void doStuff(){
        com.scheduler.process.Process p = new com.scheduler.process.Process();
        state s = state.READY;  //fails if I don't also explicitly import Process.state
        p.setCurrentState(s);  //says I need a declarator id after 's'... this is wrong.
        p.setCurrentState(state.READY);
    }

}

我需要在课堂上有一个方法——但我们仍然在这里遗漏了一些东西(可能很明显)。当我通过命令行并在编译过程后在机器类上运行 javac 时,我仍然收到以下错误:

mseil@context:/media/MULTIMEDIA/Scratch/Scratch/src/com/scheduler/machine$ javac Machine.java Machine.java:3: package com.scheduler.process does not exist import com.scheduler.process.Process; ^

所以我想现在的问题变成了,我错过了什么白痴的东西,阻止我手动编译eclipse在幕后为我做的事情?

====== 问题在这里解决:
Java 泛型代码在 Eclipse 中编译,但不在命令行中

4

2 回答 2

3

这对我有用:

  1. 下载最新的 Eclipse
  2. 创建新项目
  3. 创建两个包com.scheduler.processcom.scheduler.machine
  4. Process在 packagecom.scheduler.process和 class Machinein 中创建类com.scheduler.machine并从您的帖子中复制它们的内容,修改它们以符合 Java 语言语法,如下所示: 在此处输入图像描述 在此处输入图像描述
  5. 一切都立即编译。

------ 回答上一版的问题 ------

要回答现在的问题:您需要要么 要么 import com.scheduler.process.Process.status并将import com.scheduler.process.Process.*状态称为status

或者

import com.scheduler.process.*import com.scheduler.process.Process将状态称为Process.status

------ 回答原版问题 ------

  1. 您不能导入不在某个包内的类。你就是不能。从未命名的包中导入类型是编译时错误

  2. 如果你的类在同一个包中,或者你的所有类都是无包的,你不需要导入任何东西。

  3. 如果 Process 类在某个包中,则可以仅导入其 status 内部类:import a.b.c.Process.status就可以了。

  4. 您所有的 Windows/Linux 迁移问题都与您看到的 Java 和异常无关。import Process.state;将在任何操作系统上产生异常,因为您无法导入不属于任何包的类。

于 2011-11-11T08:59:55.277 回答
1

Eclipse 默认不使用 Sun JDK。我假设您使用的是 Eclipse 的内置编译器,因为 Sun 的 JDK 和 OpenJDK 几乎相同。

大多数情况下,Java 代码在 Windows 和 Linux 上的编译和运行完全相同(除非您使用一些特定于平台的操作)

我怀疑您没有以相同的方式构建代码,并且当您编译时MachineProcess该类尚未编译。

我建议你使用像mavenor这样的标准构建系统ant,它会在任何地方构建相同的。无法在 Linux 上运行 Eclipse 或.class在 Windows 上使用相同的版本,因为它们在任何情况下都不需要重新编译。

顺便说一句:您不需要导入Process.state,因为它没有使用并且它在同一个包中(所以如果你这样做了,你就不需要)

于 2011-11-11T08:20:35.970 回答