Как добавить дженерики в мой код

1

Мне нужно использовать generics для моего nestList. Какой синтаксис я могу использовать, чтобы как Integer и String списки могли быть добавлены во вложенные списки, а также из любых других типов?

    // integer list
    List<Integer> listInteger = new ArrayList<Integer>(Arrays.asList(1, 2));

    // string list
    List<String> listString = new ArrayList<String>(Arrays.asList("abc", "xyz"));

    // nested lists.
    List nestedList = new ArrayList();
    nestedList.add(listInteger);
    nestedList.add(listString);
    nestedList.add("A");
  • 0
    Это полная противоположность дженериков.
  • 0
    Хороший вопрос, поначалу непросто понять дженерики (я довольно долго боролся с ними, когда впервые изучал ООП).
Показать ещё 3 комментария
Теги:
generics

4 ответа

2
Лучший ответ

Внесите тип как Объект, когда вы добавляете в NestedList различные типы объектов (list, String).

List<Object> nestedList = new ArrayList<Object>();

Вы также можете использовать тип как Список только в том случае, если вы добавляете объекты списка в nestedList.

List<List> nestedList = new ArrayList<List>();

Но это приведет к ошибке, если вы попытаетесь добавить nestedList.add("A"), а также предложит предупреждение для использования необработанных типов.

4

Поскольку вы хотите хранить списки и объекты, не связанные с коллекцией ("A"), вы должны хранить объекты в своей коллекции, например:

import java.util.*;


public class Main {
    public static void main(String[] args)
    {
        // integer list
        List<Integer> listInteger = new ArrayList<Integer>(Arrays.asList(1, 2));

        // string list
        List<String> listString = new ArrayList<String>(Arrays.asList("abc", "xyz"));

        // nested lists.
        List<Object> nestedList = new ArrayList<Object>();
        nestedList.add(listInteger);
        nestedList.add(listString);
        nestedList.add("A");
    }
}

Просто обратите внимание, что List<Object> заключается в том, чтобы избежать компилятора из жалобы на то, что ваша коллекция не имеет типа. Эффективно, List<Object> и List - это одно и то же.

Вы могли бы подавить предупреждение, используя это:

import java.util.*;


public class Main {

    @SuppressWarnings({"rawtypes", "unchecked"})
    public static void main(String[] args)
    {
        // integer list
        List<Integer> listInteger = new ArrayList<Integer>(Arrays.asList(1, 2));

        // string list
        List<String> listString = new ArrayList<String>(Arrays.asList("abc", "xyz"));

        // nested lists.
        List nestedList = new ArrayList();
        nestedList.add(listInteger);
        nestedList.add(listString);
        nestedList.add("A");
    }
}

Но в конечном итоге решение в целом не очень хорошо. У меня нет всех ваших требований, но лучше было бы иметь объект для хранения всех ваших коллекций и объектов. Вы будете чище и свободны от @SuppressWarnings, которые считаются плохими.

Что-то вроде:

MyObj myobj = new MyObj();
nestedList.setIntegers(listInteger);
nestedList.setStrings(listString);
nestedList.setSomeProperty("A");
2

Создание этого List<Object> = new ArrayList<>(); позволит вам добавлять любые типы объектов независимо от их типа.

  • 0
    Я не говорю, что вы обязательно ошибаетесь, но теперь вам нужно сделать два приведения - один, чтобы получить внутренний список, а другой, чтобы получить объект из внутреннего списка.
  • 0
    @Makoto: Если автор не хочет использовать метод toString для всего :) (чего он, вероятно, не делает)
0

Просто измените эту строку

    List<List> nestedList = new ArrayList<List>();

И это потому, что вы сохраняете список в списках, тип - List :)

  • 1
    Я бы сделал это List<List<?>> .
  • 1
    Но когда вы отправляетесь для извлечения информации из этого списка, вместо этого она набирается с помощью Object .
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню