Factory方法返回给定接口的实现

时间:2013-03-26 19:04:18

标签: java generics

考虑代码:

/**
 * 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实现

1 个答案:

答案 0 :(得分:1)

需要强制转换,因为在编译时,无法判断AddressBookFrameT的实例。

要避免警告,请在运行时检查类型:

return uiClass.cast(new AddressBookFrame());

这样做,你的地图实现将起作用并且是类型安全的。