我试图在多线程应用程序上应用状态模式。问题是编译器不喜欢我的类扩展Thread的事实。这是代码:
public class ConnectionHandler extends Thread
private State lockedState;
public ConnectionHandler(Socket socket){
...
lockedState = new LockedState(this);
}
public State getState(){}
public void setState(State state){}
{
public interface State {
public void PASSWD(String pass);
public void ACCESS(String file);
public void getDIR();
public void QUIT();
}
public class LockedState implements State {
ConnectionHandler connectionHandler;
public LockedState(ConnectionHandler handler){
connectionHandler=handler;
}
public void PASSWD(String pass){
public void ACCESS(String file){}
public void getDIR(){}
public void QUIT(){}
}
我得到的错误是ConnectionHandler的构造函数:不兼容的类型需要找到java.lang.Thread.State:Networks2.LockedState。当我从Connectionhandler中删除extends Thread时,它不会给出任何错误,但这不是一个选项。 所以问题是:我该怎么做才能让编译器不抱怨?感谢
答案 0 :(得分:6)
我认为延长java.lang.Thread
是一个非常糟糕的主意。我怀疑你是否会提供值得延期的行为。
我打赌你真的想要实施java.lang.Runnable
并让它由java.lang.Thread
执行。
答案 1 :(得分:1)
问题是您扩展了Thread并且在构造函数中没有明确的super()
调用。由于Thread
中不存在no-arg构造函数,因此需要在超级cal中显式调用其中一个公共构造函数。
当您实施Runnable
而非扩展Thread
时,您不会遇到问题。使用new Thread(runnable)
,您可以构造一个执行给定的可运行实例的标准线程。
答案 2 :(得分:1)
java.lang.Thread已经包含名为State的内部类。所以你的变量被声明为不同的类型。难怪它失败了。
只需将您的类State重命名为MyState或其他任何名称。
另外,我同意其他建议使用Runnable而不是Thread。但这是为了回答具体问题,为什么它无法编译。顺便说一句,编译器消息已经给出了答案,因为它说它不能分配给java.lang.Thread.State。