Java基础-----泛型
文章目录
一、泛型介绍
1.1、泛型基本概念
1.2、泛型的好处
1.3、类型擦除
二、泛型的使用
2.1、定义泛型
2.2、泛型类
package wr.oyc;
//泛型类
public class Generic <T>{
private T flag ;
private T name ;
public T getFlag() {
return flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
public <T> T getName (T name) {
return name ;
}
public <T> void setName(T name){
System.out.println(name);
}
}
package wr.oyc;
public class Main {
public static void main(String[] args) {
//泛型类的使用
// 避免类型转换的失败
Generic<String> generic = new Generic<>();
generic.setFlag("我的世界");
System.out.println(generic.getFlag());
Generic<Integer> genericInteger = new Generic<>();
String name = genericInteger.getName("12");
Integer integer = genericInteger.getName(123);
System.out.println(name);
System.out.println(integer);
}
}
2.3、泛型接口
package wr.oyc.interface1;
public interface Igenic<T> {
public T getName(T name) ;
}
package wr.oyc.interface1;
public class IgenicImpl implements Igenic {
@Override
public Object getName(Object name) {
return name;
}
}
package wr.oyc.interface1;
import wr.oyc.Generic;
public class Main {
public static void main(String[] args) {
Igenic<Integer> igenic = new IgenicImpl();
int name = igenic.getName(123);
System.out.println(name);
}
}
在实现类那里不写类型,那么就Object类
2.4、泛型方法
2.4.1、非静态方法
2.4.2、静态方法
静态方法中使用泛型时有一种情况需要注意,
静态方法无法访问类上定义的泛型;
如果静态方法操作的引用类型不确定的时候,必须药将泛型定义在方法上
package wr.oyc.staticmethod;
public class Main01 {
public static <T> T getName(T name){
return name;
}
public static <T> void setName(){
System.out.println("使用了setName()");
}
}
package wr.oyc.staticmethod;
public class TestMain01 {
public static void main(String[] args) {
String str = Main01.getName("a");
double d = Main01.getName(1.0);
System.out.println(d);
System.out.println(str);
}
}
2.4.3、泛型方法与可变参数
在泛型方法中,泛型也可以定义可变参数
package wr.oyc.variableparam;
public class Main01 {
//遍历任意类型的数组
public static <T> void forArr (T...t){
for (T a :t) {
System.out.println(a);
}
}
}
package wr.oyc.variableparam;
public class MainTest {
public static void main(String[] args) {
// String [] strs = new String[]{"1","3"};
// Main01.forArr(strs);
//
// Integer [] i = new Integer[]{1,2,3,5,4,12};
// Main01.forArr(i);
Object [] a = new Object[]{
"a" , true , 'a'};
Main01.forArr(a);
}
}
2.5、通配符和上下限定
2.5.1、无界通配符
Genic类
一个showMessage类(里面有一个方showFlag需要闯入Generic对象) 首先我把泛型写死
那么在测试方法中,会发现爆红
原因如下:
解决方案:
在showMessage类中方法showFlag方法中Generic类的泛型写为<?>
2.5.2、上界通配符
上限限定表示通配符的类型是T类以及T类的子类或者T接口以及T接口的子接口
该方法同样使用于泛型的上限限定
只要是Integer的子类以及Integer即可
2.5.3、下界通配符
下限限定表示通配符的类型是T类以及T类的父类或者T接口以及T接口的父接口
注意:该方法不适用泛型类
只要是Integer的父类都行
三、 泛型总结