* 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();
}
}
```