我的任务是创建一个翻译器,就像我在前面讨论过的那样。 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