2013-03-12 3 views
-2

Я пытаюсь создать общий завод для интерфейса Mapper, который зависит от типа класса ресурсов.Java Generic Factory

Вот код:

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

В чем вопрос? –

+0

Как исправить ошибку компиляции при возврате IntegerMapper(); // Ошибка компиляции –

ответ

4

Для создания экземпляра класса, вы должны использовать ключевое слово new:

return new IntegerMapper(); 

Edit: компилятор также не достаточно умны, чтобы знать что если 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() ', чтобы вернуть класс. –

+0

новое не помогает. Я забыл добавить его в фрагмент. Фактическая ошибка компиляции: Тип несоответствия: невозможно преобразовать из IntegerMapper в Mapper

+0

Отредактировано решение. –