JavaDeveloper
JavaDeveloper

Reputation: 5660

How to add generics to my code

I need to use generics for my nestList. What syntax I can use so that both Integer and String lists can be added to nested lists as well as of any other types ?

    // 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");

Upvotes: 1

Views: 96

Answers (4)

user153
user153

Reputation: 146

Make the type as Object as you are adding different types of Objects(list,String) into the nestedList.

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

You can also use type as List only if you are adding list Objects in nestedList.

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

But this will error out if you try to add nestedList.add("A") , also It will also prompt a warning for using raw types.

Upvotes: 2

Alexandre Santos
Alexandre Santos

Reputation: 8338

Since you want to store lists AND non-collection objects ("A") you should store Objects in your collection, like:

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");
    }
}

Just note that List<Object> is just to avoid the compiler from complaining that your collection doesn't have a type. Effectively, List<Object> and List are the same thing.

You could have suppressed the warning using this:

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");
    }
}

But ultimately, the solution in general is not good. I don't have all your requirements, but a better idea would be to have an object to store all your collections and objects. You code would be cleaner and free from @SuppressWarnings, which are considered bad.

Something like:

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

Upvotes: 4

cbender
cbender

Reputation: 2251

Making it List<Object> = new ArrayList<>(); would allow you to add any type of Object regardless of type.

Upvotes: 2

libik
libik

Reputation: 23029

Just change this line

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

And it is, because you are storing list in lists, the type is List :)

Upvotes: 0

Related Questions