一、泛型的简单入门
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、泛型类的对象其实是相同的类型;