#java #generics
#java #общие
Вопрос:
Я довольно долго искал это, и ничто на самом деле не приближается к тому, что мне нужно.
Пример кода:
public class MyQueue<E extends Delayed amp; Serializable> extends DelayQueue<E> {
private Class<E> mClass;
public MyQueue(Class<E> type) {
super();
mClass = type;
}
}
myQueue создается следующим образом: MyQueue q<MyObj> = new MyQueue<MyObj>(MyObj.class);
.
Мой вопрос: Как я могу написать конструктор таким образом, чтобы параметр «type» имел правильный параметризованный тип «E extends Delayed amp; Serializable»?
Я надеюсь, что я все правильно объяснил.
Заранее благодарю вас за любую помощь.
Редактировать: Из ответов и замечаний я сначала не смог выбрать правильный ответ. Итак, впервые я попытаюсь дополнить свой вопрос тем, что я хотел в первую очередь, и с чем я заканчиваю сейчас. Например, отвечая в исходном сообщении на то, что я нашел.
Очевидно, что мне нужно знать, это класс параметризованного типа E во время построения. Для обеспечения прозрачности очередь использует имя класса E (являющееся myObj) для передачи в резервное хранилище. После долгого чтения я пришел к пониманию, что я не мог получить эту информацию проще из-за удаления типа. Я был вынужден передать класс не только как параметризованный тип, но и как переменную конструктора.
Я боялся, что могу случайно вызвать конструктор как таковой (myObj и OthrObj оба реализуют Delayed amp; Serializable):
MyQueue q<MyObj> = new MyQueue<MyObj>(OthrObj.Class);
Моим лучшим вопросом должно было быть: как я могу написать конструктор таким образом, чтобы переменная конструктора E соответствовала параметризованному типу E?
Это имело бы гораздо больше смысла, и, вероятно, было бы легче понять то, что я написал. Технически большинство из вас в некотором смысле правы, и после тестирования многих вариантов я пришел к выводу, что я уже это сделал, извините, хихикает, seh и Tnem полностью правы, и оба заслуживают похвалы.
Комментарии:
1. Не могли бы вы просто указать параметр как имеющий тип E?
2. Похоже, вы уже там. Если type
MyObj
не является производным от обоихDelayed
иSerializable
, привязкаMyObj
к параметру типаE
завершится ошибкой.3. Вам нужен объект класса в качестве параметра? Или вас интересует объект типа E? Не могли бы вы показать нам сообщение об ошибке, которое вы видите?
4.
type
никогда не может иметь типE
, потому что вы не получаете экземплярE
в конструкторе.
Ответ №1:
То, что вы написали, является тем, что вы указали, type
параметр будет принудительно иметь тип Delayed amp; Serializable
. Я не вижу, что здесь не так…
Ответ №2:
Вы уже написали «конструктор таким образом, чтобы параметр «type» имел правильный параметризованный тип «E extends Delayed amp; Serializable»».
Ограничение типа из самого определения класса
public class MyQueue<E extends Delayed amp; Serializable> ...
выполняется. Вы не повторяете верхние границы для типа в определении конструктора
public MyQueue(Class<E> type) {
и в этом нет необходимости. Например. создание экземпляра типа
MyQueue<Long> myQueue = new MyQueue<Long>(Long.class);
приводит к ошибке компилятора. — Просто попробуйте.
Комментарии:
1. Нет,
type
в данном случае этоClass<E>
, неE
Ответ №3:
Я думаю, что вы хотите, как:
public class MyQueue<E extends Delayed amp; Serializable> extends DelayQueue<E> {
private E mClass;
public MyQueue(E type) {
super();
mClass = type;
}
}
Комментарии:
1. Извините, но это передача экземпляра E. Мне нужен класс E.
Ответ №4:
public MyQueue(Class<E> type) {
super();
mClass = type;
type.asSubclass(Delayed.class);
type.asSubclass(Serializable.class);//both of these throw when it can't happen
}
это явно проверяет, является ли переданный класс правильным, даже при удалении типа учета (и вызывает classcastexception, когда это не может произойти)