关于java:如何从通用静态工厂方法返回参数化派生类

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);

编辑:以上代码工作正常。不过,我更喜欢不使用原始类型CacheEvent,而是使用参数化类型。使用上述原始类型的一个明显缺点是,在以下情况下我必须强制转换:

1
   Integer v = c1.getValue(); // ERROR: Incompatible types, Required String, Found Object.

我可以按如下方式执行未选中的任务,但这会给出警告。如果可能的话,我尽量避免。

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);
    }
}

这样,当返回工厂返回的匹配实例类型时,类型参数T将被分配正确的类。

1
2
CacheEvent<Integer> cacheEvent = getCacheEvent(integerCategory, Integer.class);
int value = cacheEvent.getValue(); // no warnings!