Как бы вы создали список массивов со смешанными булерами и символами?

Я немного новый, когда дело доходит до использования ArrayList. Я знаю, как создать ArrayList со строками, я знаю, как создать его с помощью целых. Мне интересно, как мне создать ArrayList, содержащий два типа, например, Doubles и Chars (но ничего больше).

Это то, что у меня есть,

ArrayList DCList = new ArrayList(); 

Очевидно, что это неверный код Java, поэтому мой вопрос: как я могу выразить это правильно?

Вот несколько фактов для вас:

  • Вы не можете вводить примитивные значения в коллекцию (общие типы могут привязываться только к ссылочным типам)

  • Если вам обязательно нужно поместить оба char s и double s (или Characters и Doubles принимающие вышеуказанную точку), вам нужно объявить список, содержащий наименьший общий подтип Character и Double который является Object :

     List charsAndDoubles = new ArrayList(); 

    это, однако, не будет отменено Строки и Целые числа.

  • Вот как бы я решил это:

     class MyDatatype { .... } class MyDatatypeCharVariant extends MyDatatype { char data; ... } class MyDatatypeDoubleVariant extends MyDatatype { double data; ... } 

    а затем объявите список как:

     List someList = new ArrayList(); 

Вы не можете смешивать типы в Arraylist . Если вам нужны разные типы, вам нужно использовать общий тип Object .

 ArrayList DCList = new ArrayList(); 

И вы не можете использовать примитивные типы в Arraylist как int или double . Используйте Integer и Double .

 public class Pair { ... } ArrayList> DCList = new ArrayList>(); 

Я оставлю для вас реализацию classа Pair.

Во многих случаях у вас, вероятно, есть classы, которые описывают вещи, которые вы хотите сохранить, т.е.

 public class FooItem { private double doubleThing; private char charThing; public double getDoubleThing() { return doubleThing; } public char getCharThing() { return charThing; } ... } 

а затем просто используйте

 ArrayList 

Как говорит Митч, этот синтаксис не будет работать, вы могли бы создать общий тип, называемый «Либо», то, что я использовал несколько раз в прошлом.

 class Either { LEFT left; RIGHT right; public Either(LEFT left, RIGHT right) { if (left != null && right != null) { throw new IllegalStateException(); } } public LEFT getLeft() { return left; } public boolean isLeft() { return left != null; } public RIGHT getRight() { return right; } public boolean isRight() { return right != null; } } List> list = new ArrayList>(); 

Это довольно редко, но это правильный подход.

Как бы вы создали список массивов с булевыми символами и символами, а не строками или целыми числами?

Вы не можете сделать это, используя статическую типизацию. Система типа Java не позволяет этого.

Лучшее, что вы можете сделать, это реализовать class List который проверяет тип элементов, которые он помещает в список. (Вы можете расширить ArrayList и переопределить методы, которые добавляют или изменяют элементы списка.)


Ответ Тома – это еще один способ добиться этого за счет дополнительного объекта-обертки для каждого элемента списка. Это позволяет избежать приведения типов при извлечении, но вы можете сделать это, добавив методы getInt (pos) и getChar (pos) в class настраиваемого списка.