Принудительно параметризованный тип в качестве параметра конструктора должен быть правильным

#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, когда это не может произойти)