End of Java Generic
No no no no no no no!! don’t mean it wrong. I am just writing last article on Java Generics. I Hope you already had read;
I’ll continue writing practical problems related to generics, if you guys face any problem or I experience.
After reading above articles you must be clear with what are generics, how to use them, what basic mistakes we generally commit, generics type (remember A,B..E…T…Z) etc etc
You know what, wild card makes me wild everytime. See the below code
public class GenericClass<T> {
public void doSomething(Set<T> set) {
Set<?> copy = new HashSet<?>(set); //Err
}
public static void main(String args[]){
Object obj = new GenericClass();
Object obj2 = new GenericClass<String>();
Object obj3 = new GenericClass<?>();//Err:Cannot instantiate
GenericClass obj4 = new GenericClass<String>();
GenericClass<Number> obj5 = new GenericClass<String>();//Err: Type mismatch: cannot convert
GenericClass<String> obj6 = new GenericClass<String>();
//Working code
//Set<String> set;
//Set<String> copy = new HashSet<String>(set);
//obj6.doSomething(copy);
Set<String> set;
Set<?> copy = new HashSet<String>(set);
obj6.doSomething(copy);//Err: reason - Set<?> copy can accept any type of Set. But doSomething() can accept only String type of Set.
}
}
Above code, problems and reason are self explanatory. And I guess, I had covered most of them in very beginning already. Remember that, ‘T’ doesn’t like ‘?’ and ‘?’ doesn’t like ‘T’ too. So the object og GenericClass
Remember; Try to avoid wild card as more as possible. Refer below codes for better practice;
interface Collection<E> { public boolean containsAll(Collection<?> c);
public boolean addAll(Collection<? extends E> c);
}
//Above code is correct but can be rewritten as
interface Collection<E> { public <T> boolean containsAll(Collection<T> c);
public <T extends E> boolean addAll(Collection<T> c);
}
One more dice..
class Collections {
public static <T> void copy(List<T> dest, List<? extends T> src){...}
}
//Above code is correct but can be rewritten as (without using wildcard)
class Collections {
public static <T, S extends T> void copy(List<T> dest, List<S> src){...}
}
Refer below complex Generic method signature just for your reference.
public static <T extends Object & Collection<Integer>> void addToSet(Set<T> s) {...}
Leave your queries, ideas and suggestion.
