У меня есть класс, который отображает входящие сообщения для соответствия читателям на основе класса сообщений. Все типы сообщений реализуют сообщение интерфейса. Читатель регистрируется в классе mapper, указывая, какие типы сообщений он сможет обрабатывать. Эта информация должна быть сохранена в устройстве чтения сообщений в некотором роде, и мой подход состоял в том, чтобы установить массив private final
из конструктора.
Теперь, кажется, у меня есть недоразумение о дженериках и/или массивах, которые я не могу понять, см. код ниже. Что это?
public class HttpGetMessageReader implements IMessageReader {
// gives a warning because the type parameter is missing
// also, I actually want to be more restrictive than that
//
// private final Class[] _rgAccepted;
// works here, but see below
private final Class<? extends IMessage>[] _rgAccepted;
public HttpGetMessageReader()
{
// works here, but see above
// this._rgAccepted = new Class[1];
// gives the error "Can't create a generic array of Class<? extends IMessage>"
this._rgAccepted = new Class<? extends IMessage>[1];
this._rgAccepted[0] = HttpGetMessage.class;
}
}
ETA:
Как ясно указал cletus, самый простой googling показывает, что Java не разрешает общие массивы. Я определенно понимаю это для приведенных примеров (например, E[] arr = new E[8]
, где E
- это параметр типа окружающего класса). Но почему разрешено new Class[n]
? И каков тогда "правильный" (или, по крайней мере, общий) способ сделать это?