-3

我正在尝试为依赖于资源类类型的 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;
    }
4

1 回答 1

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 位用来告诉编译器你知道这个转换是安全的,并且它不应该给出警告。

于 2013-03-12T17:41:22.407 回答