首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回给定接口的实现的工厂方法

返回给定接口的实现的工厂方法
EN

Stack Overflow用户
提问于 2013-03-26 19:04:18
回答 1查看 131关注 0票数 1

考虑一下守则:

代码语言:javascript
复制
/**
 * 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()中创建一个Map,而不是在()中使用链式if-else检查:

代码语言:javascript
复制
private static Map<Class<? extends BasicUI>, Class<? extends BasicUI>> map;

然后,我将对映射的值调用newInstance(),但问题是:

  • 还得投
  • 如果我把错误的实现放进地图中,就没有类型安全性。

理想情况下,地图应该是

  • key =一些BasicUI接口
  • value =该键的某些类实现

但我不知道怎么做。

编辑:将BasicUI的另一个实现添加到代码中

EN

回答 1

Stack Overflow用户

发布于 2013-03-26 19:09:56

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

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

代码语言:javascript
复制
return uiClass.cast(new AddressBookFrame());

这样做,您的地图实现将工作,并将类型安全。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15645327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档