我的任务是创建一个翻译器,正如我之前在该线程中所讨论的那样。 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
子类型的方式进行翻译。有一对一的匹配。但是,在设计时我不知道这一点!我需要像工厂这样的东西来为我创建此翻译器,对吗?其他方法?双重派遣? 最佳答案
首先,我认为您的翻译器应该是一个接口,而不是一个类。
我也不确定我是否理解您为什么对每种源语言都有一个类。
就是说,在您设计的某个地方,您将需要一个黑匣子,该黑匣子将获取一个公共文本对象并返回一个相应的转换器。只要您返回与输入类型匹配的翻译器,就可以避免使用使用OriginaText的翻译器来实现静态类型安全的问题。请注意,这个黑匣子将不会成为翻译器。它应该可以提供适当的提供程序。如果实际上每个文本都需要新的翻译器实例,则可以是一个抽象工厂(http://en.wikipedia.org/wiki/Abstract_factory_pattern)
该工厂的实现取决于您的程序。如果您使用的语言集有限,则可以有一堆if语句,这些语句使用有关OriginalText的数据(例如其实际的类名或文本中的某些线索)。如果这很灵活,您可以编写逻辑来注册特定标准的具体翻译供应商,然后以编程方式找到与给定文本相匹配的第一项。