泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
package test.fanxing;
public class GenericTest {
/**
* 泛型:
1:JDK1.5以后引入了"参数化类型"的概念,允许程序在创建集合是指定集合元素的类型。用来约束集合保存数据统一性,Java的参数化类型被称为泛型。
2:JDK1.7出现了“菱形”写法。在定义的过程中不用指明运行时的数据类型。简化了定义.
3:所谓泛型,就是允许在定义类,接口,方法时使用类型形参,这个类型形参将在声明变量,创建对象,调用方法时动态的指明,(即传入实际的类型参数,也可称为类型实参)。
JDK1.5改写了集合框架中的全部接口和类,为这些接口,类增加了泛型支持。从而在声明集合变量,创建集合对象时传入类型实参。----模板
4:从泛型类中派生子类,当创建了带泛型声明的接口,父类之后,可以为该接口创建实现类,或从该父类派生子类。
public Children extend Father<T>
5:不能在静态成员上使用泛型类型。
6:泛型中的数据类型不能是基础数据类型,一定封装数据类型(类)
*/
public static void main(String[] args) {
Box<String> box = new Box<>("fyl");
Box<Integer> box2 = new Box<>(12);
System.out.println(box.getData());
System.out.println(box2.getData());
System.out.println(box.getClass()==box2.getClass());
Box<Number> id = new Box<Number>(99);
Box<Integer> age = new Box<Integer>(712);
Box<String> name = new Box<>("ffffff");
Box.getData1(id);
// Box.getData1(age); //编译错误,Box<Number>在逻辑上不能视为Box<Integer>的父类
/**
* 类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类
*/
System.out.println("------------------------");
Box.getData2(name);
Box.getData2(age);
Box.getData2(id);
}
}
class Box<T>{
private T data;
public Box() {
}
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
public static void getData1(Box<Number> data){
System.out.println("data :" + data.getData());
}
public static void getData2(Box<?> data){
System.out.println("data :" + data.getData());
}
}
结果:
fyl
12
true
data :99
------------------------
data :ffffff
data :712
data :99