bounded type in Java

* Bounded Type: \<T extends superClassName>
```
class Bound<T extends A> {
    private T obj;
     
    public Bound(T obj){
        this.obj = obj;
    }
     
    public void doRunTest(){
        this.obj.displayClass();
    }
}
 
class A {
    public void displayClass() {System.out.println("Class A");}
}
class B extends A {
    public void displayClass() {System.out.println("Class B");}
}
class C extends B {
    public void displayClass() {System.out.println("Class C");}
}
 
public class Main {
    public static void main(String a[]) {
        Bound<C> bec = new Bound<C>(new C());
        bec.doRunTest();
        Bound<B> beb = new Bound<B>(new B());
        beb.doRunTest();
        Bound<A> bea = new Bound<A>(new A());
        bea.doRunTest();
    }
}
```
* Multiple Bounds: \<T extends superClassName & Interface>
```
class Bound<T extends A & B> {
    private T obj;
    public Bound(T obj){
        this.obj = obj;
    }
     
    public void doRunTest(){
        this.obj.displayClass();
    }
}
 
interface B {
    public void displayClass();
}
 
class A implements B {
    public void displayClass() {
        System.out.println("Class A");
    }
}
 
public class Main {
    public static void main(String a[]) {
        Bound<A> bea = new Bound<A>(new A());
        bea.doRunTest();
    }
}
```