我正在尝试为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;
}
答案 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位告诉编译器你知道这个强制转换是安全的,它不应该发出警告。