泛型:一个未知的数据类型,参数化类型
泛型就是在类定义时,不为类中属性和方法指定数据类型,而是在类对象创建时为其指定相应的数据类型。
2.泛型的作用解决数据类型的安全问题
注意: 泛型类型必须都是引用类型。不能是基本类型。
泛型可以定义在类上,接口上,方法上。 泛型类,泛型接口以及泛型方法。泛型可以解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的数据类型或者是某个方法的返回值及参数类型。这样在类声明或者实例化时只要指定好需要的类型即可。
泛型的定义格式:
public class 类名 <泛型标志,泛型标志.......>{
}
例:
//T 泛型标志可以自定义.----> 在创建对象时,须为每个泛型指定数据类型。 class Info3.泛型的通配符(?){ private T var; public void show(){ System.out.println("var========"+var); } public T getVar() { return var; } public void setVar(T var) { this.var = var; } }
在开发中对象的引用传递是最常见的,但是若在泛型类的操作中,在进行引用传递时泛型类型必须匹配才可以传递,否则是无法传递的。如果想传递,可以定义泛型为 ? 。
4.受限泛型在引用传递中,在泛型操作中也可设置一个泛型对象的范围上限和范围下限。
范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型或者是此类型的子类,而范围下限使用super进行声明,表示参数化的类型可能是所指定的类型或者此类型的父类型。
[设置上限]
声明对象: 类名称 extends 类> 对象名称;
定义类: [访问权限] 类名称<泛型标识 extends 类>{}[设置下限]
声明对象: 类名称 super 类> 对象名称;
定义类: [访问权限] 类名称<泛型标识 super 类>{}
public class Test01 {
public static void main(String[] args) {
People p1 = new People<>();
p1.setAge(15);
}
public static void Peo(People> people){
people.show();
}
//上限 传递的参数泛型必须是Number或它的子类
public static void Peo1(People extends Number> people){
people.show();
}
//下限 传递的参数泛型必须是Number或它的父类
public static void Peo2(People super Number> people){
people.show();
}
}
class People{
public T age;
public void show(){
System.out.println("age====="+age);
}
public People() {
}
public People(T age) {
this.age = age;
}
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
}
5.泛型接口
在jdk1.5以后,泛型可以定义在接口上了,定义接口的泛型和定义泛型类语法相似。
public interface 接口名<泛型标志,泛型标志....>{
//静态常量
//抽象方法。
}
public class Test01 {
public static void main(String[] args) {
Food food = new People();
String s = food.eat();
System.out.println(s);
}
}
interface Food{
public static final String NAME=""; //常量的命名必须全部大写。
T eat();
}
//子类在实现接口时,确定泛型类型
class People implements Food{
@Override
public String eat() {
return "吃米饭";
}
}
//子类的泛型类型要与实现接口的泛型一致
class Student implements Food{
@Override
public T eat() {
return null;
}
}
6.泛型方法
前面的所有泛型操作都是将整个类进行泛型化,但同样也可以在类中定义泛型化的方法。泛型方法的定义与其所在的类是否是泛型类是没有任何关系的,所在的类可以是泛型类,也可以不是泛型类。
定义一个泛型方法:
[访问权限] <泛型标识> 泛型标识 方法名称(泛型标识 参数名称)
public class Test02 {
public static void main(String[] args) {
String s1 = Student.fun("吃饭");
Integer s2 = Student.fun(15);
Double s3 = Student.fun(170.0);
}
}
class Student {
//泛型方法: static静态成员,随着类的加载而被加载到JVM内存中。常量池
public static T fun(T t){
return t;
}
}



