当参数类型不清楚时,工厂使用泛型

时间:2013-10-02 13:37:30

标签: java generics

我的任务是创建一个翻译器,正如我在本主题前面所讨论的那样。 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相反,{ {1}}等,这是子类。

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子类型的方式进行翻译。有一对一的匹配。但是,我不知道这在设计时!我需要像工厂这样的东西为我创建这个翻译,对吗?其他方法?双重派遣?

1 个答案:

答案 0 :(得分:1)

首先,我认为您的翻译应该是一个界面,而不是一个类。 我也不确定为什么你会为每种源语言编写课程。

话虽如此,在您的设计中的某个地方,您将需要一个黑盒子,它可以获得一个公共文本对象并返回相应的翻译器。只要您返回与输入类型匹配的翻译器,您就可以使用具有使用OriginaText的翻译器而缺乏静态类型安全性。请注意,这个黑盒子不会成为翻译者。它应该是能够提供适当提供者的东西。如果您确实需要每个文本的新翻译实例,这可以是抽象工厂(http://en.wikipedia.org/wiki/Abstract_factory_pattern

此工厂的实施取决于您的计划。如果你有一组有限的语言,你可以使用一堆if语句来使用有关OriginalText的数据(例如它的实际类名或文本中的一些线索)。如果这是灵活的,您可以编写逻辑,为特定标准注册具体翻译的供应商,然后以编程方式查找与给定文本的条件匹配的第一个项目。