2013-02-09 5 views
0

То, что я хотел бы получить, - это то, что может безопасно вернуть экземпляр класса ввода. В моем случае используется как поставщик услуг. Образец кода:Тип безопасного класса getter (возвращаемый параметризованный тип)

public class MyClass { 

    private Map<String, Object> mServices; 

    public MyClass() { 
     mServices = new HashMap<String, Object>(); 
     mServices.put(XmlService.class.getName(), new XmlService()); 
    } 

    public <E extends Object> E getService(Class<?> service) { 
     return (E) mServices.get(service.getName()); 
    } 
} 

Я признаю, что я не то, что опытный с параметризованных типов, и мне нужна помощь здесь. Я не получаю объект с карты? Зачем мне бросать в E, теряя безопасность типа? Есть ли способ избежать либо литья, либо пресечения предупреждений?

ответ

1

Нет, к сожалению, это не способ избежать этого лишнего понижения. Обратите внимание, что тип вашей карты: Map<String, Object>. Object - это все компилятор Java знает о значениях. Вам нужно как-то объявить, что карта имеет разные типы ключей. Невозможно.

Но ваш код может быть немного упрощен:

public <E> E getService(Class<E> service) { 
    return (E) mServices.get(service.getName()); 
} 

Другое небольшое улучшение связано с использованием Class в качестве ключа:

private Map<Class<?>, Object> mServices; 

public <E> E getService(Class<E> service) { 
    return (E) mServices.get(service); 
} 
+0

Oh спасибо за улучшения! Что делать, если я положил карту mServices? Компилятор дает мне ошибку в методе put. –

+1

@ Kap: даже если бы это сработало, чего бы вы ожидали? 'Map.get()' будет возвращать некоторый класс, расширяющий 'Object' (согласно объявлению типа). Вам это не нужно? расширяет ', чтобы это знать. –

0

Это должно работать без смиренных:

public class ServiceLoader<T extends AbstractService> { 

private Map<String, T> services = new HashMap<String, T>(); 

T getService(Class<T> componentType) { 
    return services.get(componentType.getName()); 
} 
+0

Да, это сработает, но мне нужно иметь один класс обслуживания для каждого типа. Правильно? Вместо этого я хотел бы получить централизованный сервисный приемник. –