Я понимаю, что этот тип вопроса задавался бесчисленное количество раз, но я не нашел ответа, который, кажется, адресован и / или объясняет, что 1) я делаю неправильно и 2) что мне нужно сделать, чтобы получить его правый.
У меня есть приложение, в котором я пытаюсь управлять коллекцией очередей. Пользователи диспетчера очереди будут запрашивать очередь, предоставляя уникальный идентификатор, и менеджер вернет очередь, если она уже управляется, или создаст новую очередь (посредством отражения) и вернет ее, если она еще не была создана.
Я закодировал менеджер очередей для использования обобщений Java и столкнулся с проблемой, которую я не понимаю и не могу решить, как ее исправить.
Вот менеджер очередей:
public class QueueManager<T extends MessageType, C extends BlockingQueue<T>> {
private Map<UUID, C> queueMap;
public void removeQueue(UUID id) {
queueMap.remove(id);
}
public C getQueue(Class<C> clazz, UUID id) {
if (!queueMap.containsKey(id)) {
queueMap.put(id, constructQueue(clazz));
}
return queueMap.get(id);
}
private C constructQueue(Class<C> clazz) {
C result = null;
try {
Constructor<C> constructor = clazz.getDeclaredConstructor();
result = constructor.newInstance();
} catch (NoSuchMethodException | SecurityException | InstantiationException
| IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// handle exception
}
return result;
}
}
Код, который использует администратор очередей:
public class QueueingListener<T extends MessageType> implements MessageListener<T> {
private QueueManager<T, BlockingQueue<T>> queueMgr = new QueueManager<>();
...
@Override
public void handleMessage(T message) {
...
queueMgr.getQueue(LinkedBlockingQueue.class,
message.getMessageHeader().getUUID());
...
}
Код жалуется на ошибку компиляции:
The method getQueue(Class<BlockingQueue<T>>, UUID) in the type QueueManager<T,BlockingQueue<T>> is not applicable for the arguments (Class<LinkedBlockingQueue>, UUID)
Может кто-нибудь объяснить, что здесь не так и что мне нужно делать вместо этого?
Мне бы очень хотелось узнать, где найти действительно хороший учебник по дженерикам Java. Я посмотрел на многие источники, но они, кажется, охватывают только основы, чтобы заставить кого-то работать, и не охватывают более продвинутые концепции и более тонкие детали.