我的任務是創建一個翻譯器,就像我在前面討論過的那樣。 How do you use a generic type as return value and a generic type as a parameter?當參數類型不清時,使用泛型的工廠
簡而言之,我有一種語言需要在另一種語言中翻譯。喜歡這個。
public abstract class Translator <T extends OriginalText, V extends LanguageTranslation> {
public abstract V translate(T originalText);
}
的新的挑戰是,在設計時我沒有得到一個子類的OriginalText
翻譯,而是超類OriginalText
的一個實例。因此,當我呼叫translate
函數的實現時,我可以設置特定的LanguageTranslation
V,但需要保留OriginalText
,與EnglishText
,ChineseText
等對應,它們是子類。
// I know response type V (specific class of LanguageTranslation) from a parameter from this function.
// However, this is non-sense anyway, because Translator is abstract.
Translator<OriginalText, V> translator = new Translator<OriginalText, V>();
// At design time, I have no clue what is returned by the repository. Hence, I expect the translate method to do the appropriate decision at run time.
vType = translator.translate(repository.getTextObject(textId))
我希望我的翻譯 - 或工廠 - 的方式,是特定的OriginalText
(子類有幾種不同的屬性),我已經提供了LanguageTranslation
子類型翻譯。有一對一的匹配。但是,在設計時我不知道這一點!我需要像Factory一樣爲我創建這個翻譯器,對吧?其他方法?雙派遣?
你能展示你用於翻譯的實際方法嗎?你是否使用'OriginalText'類的一些翻譯方法? –
請指定您想要給翻譯者打電話的方式。您可以在運行時使用Object#getClass()從實例中獲取文本的實現類,這樣我就不會看到區別... – AlexR
首先回答您最後一個問題:是的,常見的屬性是所有子類的OriginalText有共同點,需要翻譯(所以,抽象類的接口)。回答你的第一個問題:翻譯者應該簡單地閱讀OrignalText子類的特殊屬性,並將其複製到LanguageTranslation中,並稍作修改和翻譯。沒有什麼特別的,但肯定是適當的治療每個。 – feder