目录
1.介绍
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?
答案是可以使用 Java 泛型。
使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。
java 中泛型标记符:
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的 java 类型
java 中泛型标记符: ETK 测试发现没有啥具体用处都是通配符只有 ?号和非? 区别 具体看如下几种写法
- ? 和 非? 泛型
- 有界 无界 泛型
2.写在类上泛型
//======================写在类上泛型/======================
static class Fx<N>{//写在类上泛型
private N pn;
public void setF(N pn){
this.pn = pn;
}
public N getF(){
return pn;
}
}
@Test
public void t19() {
Fx<String> f = new Fx<>();
f.setF("99999s");
log.info("输出泛型类型值:"+f.getF());
}
//======================写在类上泛型/======================
3.方法上泛型
//======================写在方法上泛型/======================
public <E> void gets(E[] edata){
for (E c:edata){
log.info("val = "+c);
}
}
@Test
public void t192() {
//泛型可以使用对象,不能使用8中基本类型要用对象例如(可用Integer,不可用 int)
Integer[] arr = {1,3,5,6,7};
String[] arr2 = {"ss","szs","ssc"};
gets(arr);
gets(arr2);
}
4.写在方法上 ? 泛型
//======================写在方法上 ? 泛型/======================
public void gets2(List<?> edata){
for (int i = 0; i < edata.size(); i++) {
log.info(edata.get(i).toString());
}
}
@Test
public void t193() {
List<String> arr = new ArrayList<>();
arr.add("cc");
arr.add("zz");
List<Integer> arr2 = new ArrayList<>();
arr2.add(2);
gets2(arr);
gets2(arr2);
}
//======================写在方法上 ? 泛型/====================== |
5.写在方法上 有界 ? extends 父级类 泛型
//======================写在方法上 有界 ? extends 父级类 泛型/======================
public void gets3(List<? extends String> edata){
for (int i = 0; i < edata.size(); i++) {
log.info(edata.get(i).toString());
}
}
@Test
public void t194() {
List<String> arr = new ArrayList<>();
arr.add("cc");
arr.add("zz");
gets3(arr);
}
//======================写在方法上 有界 ? extends 父级类 泛型/====================== |
6.写在方法上 有界 泛型 extends 父级类 泛型
//======================写在方法上 有界 泛型 extends 父级类 泛型/======================
public <S extends String > void gets4(List<S> edata){
for (int i = 0; i < edata.size(); i++) {
log.info(edata.get(i));
}
}
@Test
public void t195() {
List<String> arr = new ArrayList<>();
arr.add("cc");
arr.add("zz");
gets4(arr);
}
//======================写在方法上 有界 泛型 extends 父级类 泛型/====================== |
7.泛型判断对象类型使用
//======================泛型判断对象类型使用======================
public <R> void exec(R res){
if(res instanceof String){
log.info((String) res);
}else if(res instanceof Integer){
log.info(((Integer) res).toString());
}
}
@Test
public void t196() {
exec("arr");
exec(900);
}
//======================泛型判断对象类型使用====================== |
ok
持续更新