Передача массива переменной, имеющей другой тип в Java

#java #arrays #constructor

#Ява #массивы #конструктор

Вопрос:

У меня есть запрос класса со следующим:

 static Queuelt;Stringgt; q = null;  public InQueue(String[] input){  q = new LinkedListlt;Stringgt;();  } public static Queuelt;Stringgt; newInputQueue(String[] inputArray){  q.addAll(Arrays.asList(inputArray));  q.add("$");  return q; }  

И у меня есть массив в основном, который я пытаюсь сделать:

 String[] inputArr = {"id", " ", "id", "*", "id"}; InQueue inQueue = new InQueue(inputArr);  

Я хочу передать inputArr для запроса, чтобы мой массив попал в очередь. Но, очевидно, я не могу этого сделать, потому что конструктор запроса не имеет параметров. Есть ли способ сделать это? Я пробовал разные способы, и большинство из них либо не работают, либо возвращают пустую очередь.

Комментарии:

1. «потому что конструктор запроса не имеет параметров» — почему вы его не создаете?

2. Я попробовал это сделать, но все равно получаю пустую очередь

3. Пожалуйста, покажите свою попытку, и мы, возможно, выясним, в чем проблема

4. Вы уверены в статической очередиlt;Строкаgt; q ?

5. Вы никогда не добавляли значения из массива строк q , и q статичность означает q , что в любой момент времени у вас может быть только один экземпляр. Если бы вы создали новую пустую очередь постфактум, она бы для начала перезаписала/стерла все другие очереди. Вот почему вы не должны использовать static здесь, особенно для переменной экземпляра (с точки зрения дизайна).

Ответ №1:

Вы можете просто создать этот конструктор самостоятельно:

 public InQueue(String[] arr){  q = new LinkedListlt;Stringgt;(Arrays.asList(arr)); }  

Вы также должны удалить static ключевое слово как из поля q , так newInputQueue и из метода, есть ли для этого причина?

Комментарии:

1. Я пробовал это, и это возвращает пустую очередь. Я не совсем уверен, почему, поскольку мой входной массив определенно возвращает строки самостоятельно

2. Пожалуйста, опубликуйте полный код, который «возвращает пустую очередь». Этот конструктор берет массив и инициализирует поле q списком ссылок. Если в массиве есть элементы, то будет и очередь.

3. Я все исправил. Я не понимал, что вам нужно использовать массивы.asList, и именно поэтому я получал пустую очередь. Спасибо за вашу помощь, я отмечу это как правильный ответ

Ответ №2:

Измените свой класс на что-то вроде этого:

 private Queuelt;Stringgt; q = null;  private InQueue(){  q = new LinkedListlt;Stringgt;();  } public static InQueue newInputQueue(String[] inputArray){  InQueue res = new InQueue();  res.q.addAll(Arrays.asList(inputArray));  res.q.add("$");  return res; }  

В чем основные различия между этим и вашим кодом ? Во-первых, это отсутствие статики в элементе данных. статический там означает, что объект является «статическим» (своего рода уникальным/общим) для всех экземпляров вашего класса. Избавьтесь от него, чтобы избежать будущих головных болей.

Конструктор стал закрытым, это говорит любому пользователю, что должен быть альтернативный способ построения объекта.

Альтернативным способом построения объекта является статическая функция, которая может вызывать закрытый конструктор (поскольку они относятся к одному классу) и может обращаться к любому элементу данных самого класса.

Теперь всякий раз, когда вам нужно выделить запрос, вы просто используете статическую фабрику.

 InQueue myQueue = InQueue.newInputQueue(someArray);  

Ответ №3:

Самый простой способ-добавить в класс запроса другой конструктор, который преобразует массив в список ссылок. Что-то вроде:

 public InQueue(String[] inputArr) {  q = new LinkedListlt;gt; (Arrays.asList(inputArr)); }  

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

 String[] inputArr = {"id", " ", "id", "*", "id"}; InQueue inQueue = new InQueue(); inQueue = inQueue.newInputQueue(inputArr);  

Комментарии:

1. Это не сработало для меня, потому что я не могу ввести строку типа[] в запрос