2012-07-18 109 views
3

我知道這個主題有幾個線程,但我無法弄清楚我的問題在哪裏。上下搜索搜索結果我比以往更加困惑。我希望我能讓我的問題清楚。Java中的通用工廠方法

我有一個消息類型層次結構,我有這些消息的通用處理器層次結構。這我已經跑了。現在我想爲處理器實現一個工廠方法,並堅持使用我選擇的通用方法。請看我的例子:

abstract class Message 
{ 
    abstract int getTest(); 
} 

class MyMessage1 extends Message 
{ 
    @Override 
    int getTest() 
    { 
     return 1; 
    } 
} 

class MyMessage2 extends Message 
{ 
    @Override 
    int getTest() 
    { 
     return 2; 
    } 
} 

interface Processor<T extends Message> 
{ 
    void initialize(final T p_message); 

    void doWork(); 
} 

abstract class BaseMessageProcessor<T extends Message> implements Processor<T> 
{ 
    private T message; 

    @Override 
    public void initialize(T p_message) 
    { 
     message = p_message; 
    } 

    protected T getMessage() 
    { 
     return message; 
    } 
} 

class MyMessage1Processor extends BaseMessageProcessor<MyMessage1> 
{ 
    @Override 
    public void doWork() 
    { 
     // perfectly valid assignment 
     MyMessage1 msg = getMessage(); 
     // do something 
    } 
} 

class MyMessage2Processor extends BaseMessageProcessor<MyMessage2> 
{ 
    @Override 
    public void doWork() 
    { 
     // perfectly valid assignment 
     MyMessage2 msg = getMessage(); 
     // do something 
    } 
} 

到目前爲止,這是有效的,並按預期工作。但現在出廠:

class ProcessorFactory 
{ 
    <T extends Message> Processor<T> createProcessor(final Class<T> p_msgType) 
    { 
     if (p_msgType.equals(MyMessage1.class)) 
     { 
      // Type mismatch: cannot convert from MyMessage1Processor to Processor<T> 
      return new MyMessage1Processor(); 
     } 
     else if (p_msgType.equals(MyMessage2.class)) 
     { 
      // Type mismatch: cannot convert from MyMessage2Processor to Processor<T> 
      return new MyMessage2Processor(); 
     } 
     else 
     { 
      throw new Exception("Unsupported message type: " + p_msgType); 
     } 
    } 
} 

也許這是一個愚蠢的失敗,我在這裏,但我看不到它。如果有人能給我一個提示,我會很感激。

問候

塞巴斯蒂安

編輯: 確定我的錯。問題是,我得到的陳述爲評論提到「默認語言環境」(例如,第二return語句我得到的編譯錯誤)的編譯器錯誤:

類型不匹配:不能從MyMessage2Processor轉換爲處理器

+2

有什麼問題? – 2012-07-18 06:57:34

+1

第二個代碼部分有評論。我相信他們表達了問題的問題 – 2012-07-18 06:58:23

+5

我有一個問題,所以我想用Java。現在我有一個ProblemFactory – 2012-07-18 06:58:58

回答

2

要理解爲什麼你失敗了,你要明白類型擦除如何工作的:

當你清楚地知道你在做正確的事情,編譯器不和,最重要的是,不知道它,因爲設計,因爲信息已經en取消

讓我試着進一步解釋這個概念:由於類型擦除,類型T在編譯時轉爲java.lang.Object,並且Java編譯器沒有編譯時信息,說

如果a.getClass().equals(MyClass.class)然後a.getClass()將類型MyClass<MyClass>


重要:請避免編寫代碼,就像你可以,因爲這會導致HOR rible設計。如果你不想死於bug和不可違反的代碼,不要強迫類型安全的語言使用類型安全的邏輯證據,也不要編譯類型證據。 如果你在編譯器中強制使用類型安全,那麼你有可能會冒險改變類結構,並忘記改變工廠,所有的東西都編譯好,但是在運行時你會得到一個BOOM。

工廠方法通常用於隱藏調用者生成對象的邏輯的模式,如果最終出現這種情況,可能意味着您沒有正確使用泛型。多寫一節課並且設計簡潔好得多。

也許你可以添加一個額外的問題:如何以類型安全的方式實現這個模式?

+1

嗯,類型擦除。那之前的心臟:-)你是對的,我的肚子告訴我,castin在這裏沒有正確的解決方案。所以我從處理器接口中刪除了通用類型。謝謝。 – 2012-07-18 07:34:52