一、泛型的简单入门
1、简介:泛型指定义对象中可以存放的数据类型。
Box<String> box1 = new Box<String>( );
box1.setobject("hel1o");
String str = box1.getobject();
System.out.println(str);
box1. setobject(12);

  注意:泛型中不能使用基本数据类型,<>中只能是引用数据类型。

二、限定泛型的范围
1、类型参数可以是多个:
public class Run<K,V>{}private K k;
private V v;
2、可以限制类型参数的选取范围:关键词是extends,不可以是super
T限定为Animals类型:
public <T extends Animals> T Run(T t){

}
3、协变与逆变

  1、协变:将泛型的子类型变量定义为泛型的父类型。
  2、逆变:将泛型的父类型变量定义为泛型的子类型。
  3、java中不支持协变与逆变(数组支持协变),一切编程语言中,协变的数据结构都不能放入元素。
  注意:不能直接进行协变与逆变,但是可以间接协变与逆变:

Box1 box = new Box1<Dog>();Box1<Animal> anibox = box;
三、泛型擦除
Box<? extends Animal> animalBox=new Box<Dog>();
Box<Courser> courserB=new Box<Courser>();
courserB.setT(new Courser()); //赋值为猎狗的箱子也可以,因为course继承Dog
//但是任何类型都放不进去了                                                    animalBox=courserB;
animalBox.setT(new Courser());
animalBox.setT(new Dog());
//但是可以取出Animal类型的对象。
Animal animal=animalBox.getT();
//使用带super的通配符后,类似逆变
Box<? super Courser> courserBox=new Box<Courser>();
courserBox=new Box<Animal>();
//可以放入
courserBox.setT(new Courser());
//但是取出的类型推断的是Object,又需要强制类型转换了,丢失类类型信息
Object object=courserBox.getT();
四、泛型接口与泛型方法
1、泛型接口:
public interface GenericInterface<T> {
    T generatObj();
}
2、泛型方法:
public class GenericMethodDemo {
public static<T extends Animal> T changeAnimal(T t){
t.setName("修改版:"+t.getName());
return t;
}
public <G> String generateString(G g){
	return "生成的字符串:"+g.toString();
}
public static void main(String[] args) {
Dog dog=GenericMethodDemo.changeAnimal(new Dog());
GenericMethodDemo gd=new GenericMethodDemo();
String str=gd.generateString(Integer.valueOf(123));
}
}
public class TestDemo2 {
public static<T extends Animal> T getObj(T t) {
t.setName("修改后的名字是: "+t.getName( ));
return t;
}
public static void main(String[] args) {
Courser courser = new Courser("赛宝","雄","白色");
Courser C = TestDemo2.getObj(courser) ;
System.out.println(c);
}
五、Java泛型的限制

  1、泛型类参数不能实例化:如:public class Box < E>{};E a=new E();错误的。
  2、不能实例化类型参数的数组:如:E ele=new E[10];错误的
  3、类的静态变量不能声明为泛型:如:static E a;错误的
  4、泛型类不能继承自Throwable以及其子类:如:class Test extends Throwable{…};错误的
  5、不能声明泛型数组:Box[] bdog; 错误
  6、泛型在运行期的类型参数就是Object或者上边界,类型擦除;
  7、类型参数必须是引用类型,不可以是基本类型,因为其没有父类,泛型没法进行类型擦除;
  8、泛型类的对象其实是相同的类型;