How can I return parameterized derived classes from a generic static Factory Method
本问题已经有最佳答案,请猛点这里访问。
我有一个静态工厂方法:
1 2 3 4 5 6 7 8 | public static CacheEvent getCacheEvent(Category category) { switch (category) { case Category1: return new Category1Event(); default: throw new IllegalArgumentException("category!"); } } |
其中category1event定义为:
1 | class Category1Event implements CacheEvent<Integer> ... |
上面静态工厂方法的客户机代码如下:
1 | CacheEvent c1 = getCacheEvent(cat1); |
编辑:以上代码工作正常。不过,我更喜欢不使用原始类型
1 |
我可以按如下方式执行未选中的任务,但这会给出警告。如果可能的话,我尽量避免。
1 2 | // Warning: Unchecked Assignment of CacheEvent to CacheEvent<Integer>. CacheEvent<Integer> c1 = getCacheEvent(cat1); |
您可以这样做:
1 2 3 4 5 6 7 8 9 10 | // Notice the <T> before the return type // Add the type so the type for T will be determined public static <T> CacheEvent<T> getCacheEvent(Category category, Class<T> type) { switch (category) { case Category1: return (CacheEvent<T>) new Category1Event(); // Casting happens here default: throw new IllegalArgumentException("Category:" + category); } } |
这样,当返回工厂返回的匹配实例类型时,类型参数
1 2 | CacheEvent<Integer> cacheEvent = getCacheEvent(integerCategory, Integer.class); int value = cacheEvent.getValue(); // no warnings! |