Java通用工厂

时间:2013-03-12 17:37:35

标签: java generics

我正在尝试为Mapper接口构建一个依赖于资源类类型的通用工厂。

以下是代码:

public interface Resource { }

public class IntegerResource implements Resource { }

public class IntegerMapper implements Mapper<IntegerResource> {

}

    public static <R extends Resource> Mapper<R> buildMapper(Class<R> clazz){
        if (IntegerResource.class.equals(clazz)){
            return new IntegerMapper();//Compilation error: Type mismatch: cannot convert from IntegerMapper to Mapper<R>

        }
        return null;
    }

    public <R extends Resource> R getResource(Class<R> clazz){
        Mapper<R> m = buildMapper(clazz);
        return null;
    }

1 个答案:

答案 0 :(得分:4)

要构建类的实例,您必须使用关键字new

return new IntegerMapper();

编辑:如果clazz是IntegerResource类,编译器也不够聪明,那么R代表IntegerResource类型。所以你必须明确地施展它:

@SuppressWarnings("unchecked")
public static <R extends Resource> Mapper<R> buildMapper(Class<R> clazz){
    if (IntegerResource.class.equals(clazz)){
        return (Mapper<R>) new IntegerMapper();
    }
    return null;
}

SuppressWarning位告诉编译器你知道这个强制转换是安全的,它不应该发出警告。