1泛型引入目的:
解决对于两个或多个对象的所有逻辑都一样,只有对象中的某些成员变量的类型不一样
例如:一个类Person成员变量(String name,int age),这时候你想创建一个对象person1(String name,int age)和person2(String name,String age)//(仅仅age的类型不同),
(三种方法)
1.你可以创建多个Person类(导致类的膨胀,重用性差)
2.你可以将类Person的age类型设为Object 类型。这个方法其实不错,但是在你在实例化对象Person person=new Person; person.age=18;,之后你(String)person.age强转的时候编译通过,但在运行的时候出错(安全性问题)
3.你可以引入泛型Person<T>成员变量(String name,T age)//T就是泛型,这时候你在实例化的时候就可以 Person<Integer> person1 = new Person<Integer>();。这时候(T=Integer),即person1.age 的类型就是Integer类型,Person<String> person2 = new Person<String>();的类型person1.age的类型是String类型。这时你强转的时候,编译的时候就不让通,过解决了2的问题。
2基本用法:
class Person<T>{
String name;
T age;
public void printIfo(){
System.out.println(name + age);
}
}
public class GenClassDemo {
public static void main(String[] args) {
Person<Integer> person1 = new Person<Integer>();
person1.age=18;
person1.name ="小明";
person1.printIfo();
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>");
Person<String> person2 = new Person<String>();
person2.age="18岁";
person2.name ="小明";
person2.printIfo();
}
}
3泛型的特点:
-
泛型的类型参数可以是泛型类
例:(人)Person<T>(T t,String name)和(枪)Gun<T>(T name)
Person<Gun<String>> person = new Person<Gun<String>> ();
可以理解为Person<T>属性T是Gun;Gun<T>的T是String。
-
同时设定多个类型参数
例:Person<K,T...>(K name,T age...)
Person<String,Integer> person;
即K是String,T是Integer,name是String类型,age是Integer类型
-
泛型的继承
例:(人)Person<T>(T name) (老师)Teacher<K,V>(K name,V other)
class Teacher<K,V> extends Person<T>
在<>中的位置对应Teacher的K 继承Person的T; V是你想要扩展属性
-
泛型类可以实现泛型接口
Interface Print<T>{
void show(T t);
T get();
}
-
限制可用类型
父类(武器)Weapon
子类(枪)Gun(刀)Knife(盾)Shield
Person<? extend Weapon>
意思是?是继承Weapon的类型
这时候Person<T> T只能是Weapon、Gun、Knife和Shield,其他类型都不行
Person<? super Gun>
这时候Person<T> T只能是Gun、Weapon即其父类,其他类型都不行