Assign List<Something<?>> to List<Something<Object>>

Timo Meijer :

I'm running into some issues with generics and captured types that I can't figure out what the neat solution is.

I've got a variable containing a List<Something<Object>> and I want to be able to call list.add(Something<?>) and list.addAll(List<Something<?>>), but the compiler does not accept either directly.

What are the options to be able to do this?

Ahmet OZKESEK :

Can you change the List<SomeThing<Object>> with List<SomeThing<? extends Object>> ? If so here are some options;

public class StackOverflow {

    static class SomeThing<T> { 
        private T t;
        public SomeThing(T t) {
            this.t = t;
        }

        @Override
        public String toString() {
            return t.toString();
        }
    };


    public static void main(String[] args) {

        List<SomeThing<? extends Object>> sList = new ArrayList<>();

        sList.add(new SomeThing<Integer>(1));
        sList.add(new SomeThing<String>("1"));

        System.out.println(sList);

        add(new SomeThing<Integer>(1), sList);
        add(new SomeThing<String>("1"), sList);

        System.out.println(sList);

        List<SomeThing<String>> ssList = new ArrayList<>();
        ssList.add(new SomeThing<String>("a"));
        ssList.add(new SomeThing<String>("b"));

        sList.addAll(ssList);
        addAll(ssList, sList);

        System.out.println(sList);

        List<SomeThing<Integer>> siList = new ArrayList<>();
        siList.add(new SomeThing<Integer>(1));
        siList.add(new SomeThing<Integer>(2));

        sList.addAll(siList);
        addAll(siList, sList);

        System.out.println(sList);


    }

    public static void add(SomeThing<?> st, List<SomeThing<?>> stl) {
        stl.add(st);
    } 

    public static <T> void addAll(List<SomeThing<T>> st, List<SomeThing<?>> stl) {
        stl.addAll(st);
    } 
}

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=396058&siteId=1