- The question mark (?), represents the wildcard, stands for unknown type in generics.
- There may be times when any object can be used when a method can be implemented using functionality provided in the Object class or When the code is independent of the type parameter.
- To declare a Unbounded Wildcard parameter, list the ? only.
Example
package com.test.unbounded;
import java.util.Arrays;
import java.util.List;
public class UnboundedDemo {
public static void printList(List<?> list) {
System.out.println();
for (Object item : list)
System.out.print(item + " --> ");
}
public static void main(String args[]) {
printList(Arrays.asList(1, 2, 3));
printList(Arrays.asList(1.2, 2.3, 3.5));
printList(Arrays.asList("Tyson","Justin","Martin"));
}
}
Upper Bounded WildCards
- The question mark (?), represents the wildcard, stands for unknown type in generics.
- There may be times when you’ll want to restrict the kinds of types that are allowed to be passed to a type parameter.
- For example, a method that operates on numbers might only want to accept instances of Number or its subclasses.
- To declare a upper bounded Wildcard parameter, list the ?, followed by the extends keyword, followed by its upper bound.
- If we want to read values from a collection then it is better to use extends
package com.test.unbounded;
import java.util.Arrays;
import java.util.List;
public class UpperBoundDemo {
public static double sum(List<? extends Number> numberlist) {
double sum = 0.0;
for (Number n : numberlist)
sum += n.doubleValue();
return sum;
}
public static void main(String args[]) {
System.out.println("sum = " + sum(Arrays.asList(1, 2, 3)));
System.out.println("sum = " + sum(Arrays.asList(1.2, 2.3, 3.5)));
//Below will throw a compile time error
//System.out.println("sum = " + sum(Arrays.asList("Tyson","justin","Martin")));
}
}
Lower Bound WildCards
- The question mark (?), represents the wildcard, stands for unknown type in generics.
- There may be times when you’ll want to restrict the kinds of types that are allowed to be passed to a type parameter.
- For example, a method that operates on numbers might only want to accept instances of Integer or its superclasses like Number.
- To declare a lower bounded Wildcard parameter, list the ?, followed by the super keyword, followed by its lower bound.
- If we want to add values to the collection it is better if we use super
Example :
package com.test.unbounded;
import java.util.ArrayList;
import java.util.List;
public class LowerBoundDemo {
public static void addCat(List<? super Cat> catList) {
catList.add(new RedCat());
System.out.println("Cat Added");
}
public static void main(String[] args) {
List<Animal> animalList= new ArrayList<Animal>();
List<Cat> catList= new ArrayList<Cat>();
List<RedCat> redCatList= new ArrayList<RedCat>();
List<Dog> dogList= new ArrayList<Dog>();
//add list of super class Animal of Cat class
addCat(animalList);
//add list of Cat class
addCat(catList);
//compile time error
//can not add list of subclass RedCat of Cat class
//addCat(redCatList);
//compile time error
//can not add list of subclass Dog of Superclass Animal of Cat class
//addCat.addMethod(dogList);
}
}
class Animal {}
class Cat extends Animal {}
class RedCat extends Cat {}
class Dog extends Animal {}
Note : Producer and Consumer problem can be implemented using the upper and lower bound wild cards.Extends
Reference :