Generic Functionality

Generics introduced the concept of type variable. A type variable is an unqualified identifier as per the Java Language Specification, Which can be used in following ways:

  • Generic class declarations
  • Generic interface declarations
  • Generic method declarations
  • Generic constructor declarations.
class genericsDemo
{
	public static void main(String[] s)
	{
		test<Integer> t = new test<Integer>(5);
		int i = t.getI();       // No need to type cast!
		System.out.println(i);

		test<String> ts = new test<String>("This is demo.");
		String is = ts.getI();   // No need to type cast!
		System.out.println(is);
		
		xyz o = new xyz(7);
		test<xyz> txyz = new test<xyz>(o);
		xyz newo = txyz.getI();   // No need to type cast!
		System.out.println(newo);
	}	
}

 
class test<T>         // Generic class
{
	private T i;
	test(T i)     // Generic Constructor
	{
		this.i = i;	
	}	
	T getI()     // Generic Method
	{
		return i;	
	}
}


class xyz
{
	int x;
	xyz(int x)
	{
		this.x = x;
	}
	
	public String toString()
	{
		return "Value of X is: "+x;
	}
}

Above code demonstrates the use of Generic class, constructor and method. Here we are learning one more thing: It’s not a compulsion that we can only pass wrapper class objects as generic variable. A custom/User defined class’s object can also be passed as we did with: “xyz” class.

Output:

Generics Basic


Example on Generic Method

public class GenericMethodTest
{
   // generic method printArray                         
   public static <E> void printArray( E[] inputArray )
   {
      // Display array elements              
         for ( E element : inputArray )
         {        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }

    public static void main( String args[] )
    {
        // Create arrays of Integer, Double and Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

        System.out.println( "Array integerArray contains:" );
        printArray( intArray  ); // pass an Integer array

        System.out.println( "\nArray doubleArray contains:" );
        printArray( doubleArray ); // pass a Double array

        System.out.println( "\nArray characterArray contains:" );
        printArray( charArray ); // pass a Character array
    } 
}

Output:

Generics Basic


Example on Generic Interface

interface MinMax<T extends Comparable<T>> 
{
	T min();
	T max();
}
// Now, implement MinMax
class MyClass<T extends Comparable<T>> implements MinMax<T> 
{
	T[] vals;
	MyClass(T[] o) 
	{ 
		vals = o; 
	}
	// Return the minimum value in vals.
	public T min() 
	{
		T v = vals[0];
		for(int i=1; i < vals.length; i++)
		if(vals[i].compareTo(v) < 0) v = vals[i];
		return v;
	}
	// Return the maximum value in vals.
	public T max() 
	{
		T v = vals[0];
		for(int i=1; i < vals.length; i++)
		if(vals[i].compareTo(v) > 0) v = vals[i];
		return v;
	}
}
class GenIFDemo 
{
	public static void main(String args[]) 
	{
		Integer inums[] = {3, 6, 2, 8, 6 };
		Character chs[] = {'b', 'r', 'p', 'w' };
		MyClass<Integer> iob = new MyClass<Integer>(inums);
		MyClass<Character> cob = new MyClass<Character>(chs);
		System.out.println("Max value in inums: " + iob.max());
		System.out.println("Min value in inums: " + iob.min());
		System.out.println("Max value in chs: " + cob.max());
		System.out.println("Min value in chs: " + cob.min());
	}
}

Output:

Generics Basic