2011-05-22 84 views
0

我試圖在多線程應用程序上應用狀態模式。問題是編譯器不喜歡我的類擴展線程的事實。下面是代碼:Java線程 - 接口問題

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中移除擴展線程它不給任何錯誤,但那不是一個選項。 所以問題:我該怎麼做,以便編譯器不抱怨?謝謝

+0

你能發佈編譯錯誤嗎? – kuriouscoder 2011-05-22 18:30:56

+0

不兼容類型 必需java.lang.Thread.State 找到:Networks2.LockedState。 – Giannis 2011-05-22 18:36:51

回答

6

我認爲延長java.lang.Thread是一個非常糟糕的主意。我懷疑你會提供值得推廣的行爲。

我敢打賭,你真的想實施java.lang.Runnable並讓它執行java.lang.Thread

1

問題是,您擴展了Thread並且沒有在您的構造函數中調用顯式的super()。因爲Thread中不存在無參數構造函數,所以您需要顯式調用超級cal中的某個公共構造函數。

當你實施Runnable而不是延長Thread你不會有問題。並使用new Thread(runnable)可以構造一個執行給定可運行實例的標準線程。

+0

好吧,我改變了它,所以它實現了RUnnable,並且這些狀態沒有問題。謝謝 – Giannis 2011-05-22 18:41:49

1

java.lang.Thread已經包含名爲State的內部類。所以你的變量被聲明爲不同的類型。難怪它失敗了。

只需將您的班級狀態重命名爲MyState或任何其他名稱即可。

此外,我同意其他建議使用Runnable而不是Thread。但這是爲了回答爲什麼它不能編譯的具體問題。順便說一下,編譯器消息已經給出了答案,因爲它說它不能分配給java.lang.Thread.State。

+0

感謝您的回答。我想這就是我實施Runnable時修復的原因。 – Giannis 2011-05-22 18:53:01