java高级之泛型
什么是泛型?
在定义类时,不给定类中成员【属性 方法的返回类型 方法的参数】的数据类型,而在类对象创建时为其指定相应的数据类型。
泛型的作用:
为避免数据类型转换安全
泛型的运用:
1.定义一个泛型类并在其类名加上<T>表示泛型指代,如要指代多个泛型中间使用逗号隔开
2.定义数据类型中使用泛型指定
3.并且生成get、set方法、空参有参构造、toString等
public class FanXinDemo<T,E> {
public T X;
public T Y;
public E Z;
}
新建一个测试类,类中声明main方法
public class FanXInTest1 {
public static void main(String[] args) {
//new一个对象,并按照类中定义的泛型依次对应
FanXinDemo<String, Integer> demo1 = new FanXinDemo<>("东经99度","北纬66度",00);
}
}
【注:使用泛型不会出现数据类型转换问题】
泛型的通配符:
单独新建一个泛型类
类中声明一个泛型变量,并且生成get、set方法、空参有参构造、toString等
且声明一个方法,且在这个方法中输出你刚刚声明的泛型变量:如:
public class FanAllDemo<T> {
public T BMW;
public void jk(){
System.out.println("我所返回的值是:"+BMW);
}
}
再次新建测试类,类中定义main方法
【注:在main方法之外单独声明一个静态方法,以便演示泛型通配形式】:
public static void main(String[] args) {
//泛型的通配符
FanAllDemo<String> FADemo = new FanAllDemo<>("今天饿肚子了");//通用泛型一 string类型
BMWE(FADemo);
FanAllDemo<int> FADemo2 = new FanAllDemo<>(9999);//通用泛型一 Integer类型
BMWE(FADemo2);
FanAllDemo<Object> FADemo3 = new FanAllDemo<>("是他是他小哪吒");//通用泛型一 Object类型
BMWE(FADemo3);
}
//泛型通配符的静态方法
public static void BMWE(FanAllDemo<?> xw){
xw.jk();
}
以上代码显示了泛型的通配,这里仅仅演示了string,int,object等类型,仅此就可以观察出加上泛型通配符后及会包容所有
【注:泛型通配符 --> 变量<?> 变量】
受限泛型的使用:
受限泛型语法:
[设置上限]
声明对象: 类名称<? extends 类> 对象名称;
定义类: [访问权限] 类名称<泛型标识 extends 类>{}
[设置下限]
声明对象: 类名称<? super 类> 对象名称;
定义类: [访问权限] 类名称<泛型标识 super 类>{}
eg:
这里还是沿用泛型通配符建的泛型类
新建一个测试类,中声明main方法
且在main方法之外声明两个静态方法,一个上限静态方法,一个下限方法
public static void main(String[] args) {
}
//受限泛型的使用--上限(extends)
public static void BMWELimitUp(FanAllDemo<? extends Number> xw){
xw.jk();
}
//受限泛型的使用--下限(super)
public static void BMWELimitBottom(FanAllDemo<? super Number> xw){
xw.jk();
}
在main方法中new 一个泛型类,且调用上限、下限静态方法
及:
public static void main(String[] args) {
//泛型的受限使用--上限
//[只要是Number的子类都可以接受(包括本身)]
FanAllDemo<Integer> BMWELimitUpDemo = new FanAllDemo<>(2580);//上限的子类
BMWELimitUp(BMWELimitUpDemo);
FanAllDemo<Double> fanAllDemo = new FanAllDemo<Double>();//上限的子类
BMWELimitUp(fanAllDemo);
//泛型的受限使用--下限
//[只要是Number的父类都可以接受(包括本身)]
FanAllDemo<Number> BMWELimitBottomDemo = new FanAllDemo<>(666666);//下限本身
BMWELimitBottom(BMWELimitBottomDemo);
FanAllDemo<Object> objectFanAllDemo = new FanAllDemo<>();//下限的父类
BMWELimitBottom(objectFanAllDemo);
}
泛型接口:
泛型接口第一种方式:
新建一个泛型接口
public interface TestInter<T> {
void InterFan(T jk);
}
新建一个泛型接口实现类
public class TestDemo implements TestInter<String>{
//泛型接口第一种方式
@Override
public void InterFan(String jk) {
System.out.println(jk);
}
}
新建一个泛型测试类
public void main(String[] args) {
//泛型接口的第一种方式
TestDemo testDemo = new TestDemo();
testDemo.InterFan("今天好饿");
}
泛型接口第二种方式:
public class Demo {
public void main(String[] args) {
//泛型接口的第二种方式
hh<Integer> integerhh = new hh<>();
integerhh.InterFanTwo(6666);
}
//泛型接口2
interface TestInterTwo<T>{
void InterFanTwo(T jk);
}
//泛型接口2的实现类
class hh<T> implements TestInterTwo<T>{
@Override
public void InterFanTwo(T jk) {
System.out.println(jk);
}
}
}
【泛型接口2以便方便不在新建文件】
以上便是泛型的基本使用知识,如有漏缺,请在下方评论区留言