泛型的知识点
泛型的知识点
一、泛型的概念
泛型:是把一种类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊类型。参数化类型,把类 当做参数进行传递
格式: <数据类型> 数据类型为引用类型
泛型的优点
A.把运行时期的问题提前到了编译时期
B.避免了强制类型的转换
C.优化了程序设计,更加明确需要传递的类型
二、例子
package com.GenericDemo;
class Person<T>{ //泛型声明
private T t;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(T t) {
super();
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class GenericDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person<String> p=new Person();
p.setT("小明");
/*p.setT(12); 报错,因为泛型约定了类型为String,输入其他类型会报错,
这就是泛型更明确传值*/
String t = p.getT();
System.out.println(t);
}
}
泛型还可以通过定义类,把类定义为参数类型,从而进行运算
例如
MyClass2 mc2_stu = new MyClass2();
mc2_stu.setT(new Student(“张三”));
Student t2 = mc2_stu.getT();
System.out.println(t2);
System.out.println(mc2_stu);
}
}
class MyClass2{
private T t;
public MyClass2(){}
public MyClass2(T t){
this.t = t;
}
2.1 泛型可以定义多个参数,中间用逗号隔开,形如: class Animal<T,K> { }
2.2 泛型中典型的例子是仓库存取东西
例如:
package com.hwua.GenericDemo;
import java.util.Arrays;
public class GenericDemo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
CangKu list = new CangKu();
for (int i = 0; i < 50; i++) {
list.add(“data”+i);
}
System.out.println(list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
class CangKu{
private Object[] data;
private int size = 0;//物品的个数 0
public CangKu(){
//初始化默认仓库的存储的数量
//泛型是不能够创建数组的
data = new Object[10];
}
public void add(T obj){
//当存储到一定数量时,数组通过方法进行扩容
if(size+1>data.length){
data = Arrays.copyOf(data, data.length*2);
}
data[size++] = obj;
}
//取东西
public T get(int index){
return (T) data[index];
}
//查询仓库中物品个数
public int size(){
return size;
}
}
2.3 泛型之间的继承
泛型之间的继承可以获得父类的类型,在进行数据类型定义时,操作方便
泛型继承的注意事项:
A.泛型可以继承泛型
B.父泛型类若有一个泛型,则子类必须至少有1个泛型,子泛型名必须与父泛型名相同
例如:
class SuperClass{
private T1 var1;
public SuperClass(T1 var1){
this.var1 = var1;
}
public T1 show(){
return var1;
}
}
class SubClass<T1,T2> extends SuperClass{
private T2 var2;
public SubClass(T1 var1,T2 var2){
super(var1);
this.var2 = var2;
}
public void show2() {
// TODO Auto-generated method stub
System.out.println(super.show());
System.out.println(var2);
}
}
public class GenericDemo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass<String,Integer> ss = new SubClass(“ss”, 33);
ss.show2();
}
}
2.4 泛型继承
格式为:<数据类型 extends 数据类型>
注意事项:
A.如果泛型是继承于某个类,那么在实例化的时候必须传这个泛型的本
类或者其子类 (也就是说实例化时传的是本类或者是子类)
B. 泛型无论是继承类还是实现接口,都要使用extends这个关键字
2.5 通配符:?
?:任意类型,如果没有明确,那么就是Object以及任意Java类了。
? extends E:向下限定,E或者它的子类
? super E:向上限定,E或者它的父类。
2.6 泛型方法
格式:
-
访问修饰符 <泛型> 返回类型 方法名(参数列表){ }
- 注意:
-
1、泛型方法有时候能代替方法的重载
-
2、参数列表中的泛型需要和方法的泛型保持一致
三、总结
1、泛型是一种参数化类型(类似于形参),类型为引用类型
2、泛型的参数类型可以有多个,用逗号间隔
3、泛型之间的继承,父类只有一个类型,子类至少有一个,
而且子类泛型名(第一个)还要与父类相同
4、泛型继承,无论是继承类还是实现接口,都要用extends
5、泛型方法需要注意的是参数列表中的泛型需要和方法的泛型保持一致