泛型,字面含义广泛的类型,可以用于类、接口、方法使得同一套代码可以用于多种数据类型。这样不仅可以复用代码,降低耦合,而且可以提高代码的可读性和安全性。
我们注重客户提出的每个要求,我们充分考虑每一个细节,我们积极的做好成都网站设计、网站制作服务,我们努力开拓更好的视野,通过不懈的努力,创新互联建站赢得了业内的良好声誉,这一切,也不断的激励着我们更好的服务客户。 主要业务:网站建设,网站制作,网站设计,小程序定制开发,网站开发,技术开发实力,DIV+CSS,PHP及ASP,ASP.Net,SQL数据库的技术开发工程师。
首先看一个例子:
Pairkv.java
package com.paint.test;public class Pairkv {
U first;
V second;
public Pairkv(U first,V second){
this.first = first;
this.second = second;
}public U getFirst() { return first; } public V getSecond() { return second; } @Override public String toString() { return super.toString()+ "\n this first:"+first+",this second:"+second; }
}
程序入口类:
import javax.swing.;
import java.util.;
import com.paint.test.*;public class HelloWorld {
public static void main(String[] args) {
Pairkvpairkv = new Pairkv<>(1,"泛型测试");
System.out.println(pairkv.toString());
}
}
那么注意,泛型不是必须的编程方式,泛型是为了让我们编程逻辑更清晰、方便解耦、不易出错的一种辅助的数据结构方式,编译器会将泛型代码转为普通非泛型代码。那么下面以集合(接口)、方法、类三种常见的使用场景来讲解泛型的使用:
场景1、泛型在集合中的作用
- JDK1.5以后引入泛型 ArrayList
泛型的作用:限定对象里面能够操作的数据类型。这样更安全,并且当从集合获取一个对象时,编译器也可知道该对象的类型,不需要对对象进行强制类型转换ArrayList<String> arrayList01 = new ArrayList(); arrayList01.add("aaaa"); arrayList01.add("bbbb"); // arrayList01.add(1);//编译时就报错,只能添加String类型数据 String a3 = arrayList01.get(0); String a4 = arrayList01.get(1); System.out.println(a3); System.out.println(a4);//不需要再进行类型转换
注意:
①泛型不接受 8 种基本数据类型,必须申明引用类型
// Map
// Map
②限定对象里面能够操作的数据类型
List
Map
③Cat继承Animal,但List
ArrayList
后面<>可以不写,前后类型要一致
④数据的基本术语
ArrayList
ArrayList
ArrayList
整个ArrayList
ArrayList为原始类型
场景2、泛型方法
先来说泛型方法的定义形式:
public <类型参数名称> 类型参数 func(),类型参数为T放在了返回值前面(做了一个标记说明后面类型T就是这里提前预声明的),如下:
public static <T> T func(T t);
代码案例:
import com.paint.test.*;
public class test(){
public static void main(){Integer[] intarr = new Integer[]{1,3,4,9,11}; String[] strings = new String[]{"aasdf","erewrre","ppppp"}; GenericFunc.change(intarr,1,3); GenericFunc.change(strings,0,2); System.out.println(Arrays.toString(intarr)); System.out.println(Arrays.toString(strings)); }
}
GenericFunc类中我们将泛型和非泛型方法放在一起做类比,泛型优化了数据类型方法,否则我们将多次定义不同类型的执行方法change,如下:
package com.paint.test;
public class GenericFunc {
public static <T> void change(T[] arrStr, int start, int end){ T temp = arrStr[start]; arrStr[start] = arrStr[end]; arrStr[end] = temp; } public static void changeStr(String[] arrStr,int start,int end){ String temp = arrStr[start]; arrStr[start] = arrStr[end]; arrStr[end] = temp; } public static void changeInt(Integer[] arrStr,int start,int end){ System.out.println("传参数组变量"+arrStr.toString()); Integer temp = arrStr[start]; arrStr[start] = arrStr[end]; arrStr[end] = temp; }
}
注意:
①这里的T可以用任意的大写字母表示,通常T代表任何类,E代表element或exception,k代表键名key,value代表值value
②这里的
③泛型中可同时有多个类型如:public static
场景3、泛型类
泛型类最常见的作用是作为容器类,容纳并管理多项数据类。当一个类中多处需要使用到同一个泛型(如类中包含集合泛型、方法泛型),可以把泛型定义在类上。静态方法不能使用类定义的泛形,而应该单独定义泛形。
定义形式:
public class classname
{ }
注意:
静态方法不能使用类定义的泛形,而应该单独定义泛形。静态方法用类调用 ,类调用静态方法时类还没有实例化从而无法调用后面的泛型,所以静态方法中有泛型,必须要自己定义方法泛型。泛型方法始终以自己定义的类型参数为准。
本文标题:Java学习升阶-01-一篇看懂java泛型
转载来源:http://lswzjz.com/article/pjsepo.html