2013-03-12 57 views
-2

我想建立一个取决于资源类类型的Mapper接口的通用工厂。Java通用工厂

下面是代码:

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

问题是什么? – 2013-03-12 17:38:18

+0

如何修复编译错误返回IntegerMapper(); //编译错误 – 2013-03-12 17:40:21

回答

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位在那里告诉您知道这个转换是安全的编译器,而且它不应该给一个警告。

+0

编译器错误实际上是关于'IntegerMapper()'不是一个函数,因为它是一个构造函数,所以你需要用'new IntegerMapper()'返回一个类。 – 2013-03-12 17:45:53

+0

新的没有帮助。我忘了将它添加到片段中。实际的编译错误是:类型不匹配:无法从IntegerMapper转换到映射器 2013-03-12 17:47:19

+0

编辑我的答案。 – 2013-03-12 17:53:10