考虑代码:
/**
* For a given interface, return a default implementation
*/
public class ImplementationFactory<T>
{
public static void main(String[] args)
{
AddressBookUI ui = ImplementationFactory.getImpl(AddressBookUI.class);
}
public static <T extends BasicUI> T getImpl(Class<T> uiClass)
{
if (uiClass.equals(AddressBookUI.class))
{
/*
* Compile error if cast is removed.
* Casting to T leaves an unchecked cast warning.
*/
return (T) new AddressBookFrame();
}
// a bunch more else-if checks would be here
return null;
}
}
// These are defined elsewhere:
interface BasicUI {}
interface AddressBookUI extends BasicUI {}
interface StockQuoteUI extends BasicUI {}
class AddressBookFrame implements AddressBookUI {}
class StockQuoteFrame implements StockQuoteUI {}
为什么首先需要 getImpl() 中的演员表?有没有更好的方法来解决这个问题?
此外,我没有在 getImpl() 中进行链式 if-else 检查,而是尝试将 Map 创建为:
private static Map<Class<? extends BasicUI>, Class<? extends BasicUI>> map;
然后我会在地图上的值上调用 newInstance() ,但问题是:
- 还是得投
- 如果我将错误的实现放入映射中,则没有类型安全。
理想情况下,地图将是
- key = 一些 BasicUI 界面
- value = 该键的某个类实现
但我不知道该怎么做。
编辑:在代码中添加了 BasicUI 的另一个实现