-
Notifications
You must be signed in to change notification settings - Fork 17
Java Generic Class Examples
Ramesh Fadatare edited this page Aug 17, 2018
·
1 revision
A generic class is defined with the following format:
class name<T1, T2, ..., Tn> { /* ... */ }
The type parameter section, delimited by angle brackets (<>), follows the class name. It specifies the type parameters (also called type variables) T1, T2, ..., and Tn.
In this post, we will see two complete examples.
/**
* Generic class example. Create GenericFactory<T> to get any type of instance.
* @author javaguides.net
*
*/
public class GenericClassExample {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
GenericFactory<ProductA> factory = new GenericFactory<ProductA>(ProductA.class);
ProductA productA = factory.createInstance();
System.out.println(productA.getProductName());
GenericFactory<ProductB> factoryB = new GenericFactory<ProductB>(ProductB.class);
ProductB productB = factoryB.createInstance();
System.out.println(productB.getProductName());
GenericFactory<ProductC> factoryC = new GenericFactory<ProductC>(ProductC.class);
ProductC productC = factoryC.createInstance();
System.out.println(productC.getProductName());
}
}
class ProductA {
public String getProductName() {
return "Product A";
}
}
class ProductB {
public String getProductName() {
return "Product B";
}
}
class ProductC {
public String getProductName() {
return "Product C";
}
}
class GenericFactory<T> {
Class theClass = null;
public GenericFactory(Class theClass) {
this.theClass = theClass;
}
public T createInstance() throws IllegalAccessException, InstantiationException {
return (T) this.theClass.newInstance();
}
}
Output:
Product A
Product B
Product C
- Create generic stack class.
class Stack<E> {
private final int size;
private int top;
private E[] elements;
public Stack() {
this(10);
}
@SuppressWarnings("unchecked")
public Stack(int s) {
size = s > 0 ? s : 10;
top = -1;
elements = (E[]) new Object[size]; // create array
}
public void push(E pushValue) {
if (top == size - 1) // if stack is full
throw new FullStackException(String.format("Stack is full, cannot push %s", pushValue));
elements[++top] = pushValue; // place pushValue on Stack
}
public E pop() {
if (top == -1) // if stack is empty
throw new EmptyStackException("Stack is empty, cannot pop");
return elements[top--]; // remove and return top element of Stack
}
}
- Create custom exception to check full and empty of stack - EmptyStackException,FullStackException.
class EmptyStackException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
public EmptyStackException() {
this("Stack is empty");
}
public EmptyStackException(String exception) {
super(exception);
}
}
class FullStackException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
public FullStackException() {
this("Stack is full");
}
public FullStackException(String exception) {
super(exception);
}
}
- Let's create Main class to demonstrate generic class example.
/**
* Create Generic Stack.
* @author javaguides.net
*
* @param <E>
*/
public class GenericStackExample {
private static Double[] doubleElements = { 1.1, 2.2, 3.3, 4.4, 5.5};
private static Integer[] integerElements = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
private static Stack<Double> doubleStack = new Stack<Double>(5); // Stack of
// Doubles
private static Stack<Integer> integerStack = new Stack<Integer>(10); // Stack
// of
// Integers
// generic method testPush pushes elements onto a Stack
private static <T> void testPush(String name, Stack<T> stack, T[] elements) {
try {
System.out.printf("\nPushing elements onto %s\n", name);
for (T element : elements) {
System.out.printf("%s ", element);
stack.push(element);
}
} catch (FullStackException fullStackException) {
System.out.println();
fullStackException.printStackTrace();
}
}
// generic method testPop pops elements from a Stack
private static <T> void testPop(String name, Stack<T> stack) {
try {
System.out.printf("\nPopping elements from %s\n", name);
T popValue;
while (true) {
popValue = stack.pop();
System.out.printf("%s ", popValue);
}
} catch (EmptyStackException emptyStackException) {
System.out.println();
emptyStackException.printStackTrace();
}
}
public static void main(String args[]) {
testPush("doubleStack", doubleStack, doubleElements);
testPop("doubleStack", doubleStack);
testPush("integerStack", integerStack, integerElements);
testPop("integerStack", integerStack);
}
}
Output:
Pushing elements onto doubleStack
1.1 2.2 3.3 4.4 5.5
Popping elements from doubleStack
5.5 4.4 3.3 2.2 1.1
com.javaguides.generics.classes.EmptyStackException: Stack is empty, cannot pop
Pushing elements onto integerStack
1 2 3 4 5 6 7 8 9 10
Popping elements from integerStack
10 9 8 7 6 5 4 3 2 1
com.javaguides.generics.classes.EmptyStackException: Stack is empty, cannot pop