- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的任务是创建一个翻译器,正如我在本线程前面讨论的那样。 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
的子类进行翻译,而是获取父类(super class) 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
子类型的方式进行翻译。存在一对一的匹配。但是,我在设计时并不知道这一点!我需要像工厂这样的东西来为我创建这个翻译器,对吧?其他方法?双重调度?
最佳答案
首先,我认为你的 Translator 应该是一个接口(interface),而不是一个类。我也不确定我是否理解为什么每种源语言都有一个类(class)。
话虽这么说,在您的设计中的某个地方,您将需要一个黑匣子来获取通用文本对象并返回相应的翻译器。只要您返回与输入类型匹配的翻译器,您就可以忍受使用 OriginalText 的翻译器缺乏静态类型安全性。请注意,这个黑匣子不会成为翻译器。它应该是能够提供适当的提供者的东西。如果您确实需要为每个文本添加新的翻译器实例,这可以是一个抽象工厂 ( http://en.wikipedia.org/wiki/Abstract_factory_pattern )
这个工厂的实现取决于你的程序。如果您的语言集有限,则可以使用一堆 if 语句来使用有关 OriginalText 的数据(例如其实际的类名称或文本中的一些线索)。如果这是灵活的,您可以编写逻辑来注册特定条件的具体翻译器的供应商,然后以编程方式查找与给定文本的条件相匹配的第一个项目。
关于java - 当参数类型不清楚时使用泛型工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19138238/
我是一名优秀的程序员,十分优秀!