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