Java泛型

Java泛型教程

一般的类和方法,只能够使用具体的类型。要么是基本类型,要么是自己定义的类。如果要编写可以应用于多种类型的代码,那么怎么办呢?

你会想到我们之前讲过的 Object 这个在 Java 语言中万类之父。它可以表示任何一个对象。它虽然可以,但是在使用的时候,如果控制不好,它容易发生问题,导致系统异常。

比如我们在一个对象里面声明了两个变量,两个变量的类型是一样的,都是数字类型,如果这个时候定义成 Object 类型,那么在给两个属性赋值的时候,具体的值类型就不可控了。

有可能是 String 类型,有可能是 Long 类型,这样的话代码就不是安全的了,会容易发生异常。所以就用泛型来处理这样的情况。

Java泛型

泛型类语法

[访问权限] class 类名称<范型标识符 1,泛型标识符 2,... ,泛型标识符n>{ [访问权限] 泛型类型标识符 变量名称; [访问权限] 泛型类型标识符 方法名称(){}; [访问权限] 返回值类型声明 方法名称(泛型类型标识 变量名称){}; }

参数

参数 描述
访问权限 java 语言里面的四种访问权限 private、default、protected、public
范型标识符 自定义的范型名称,任意字母都可以,一般我门用一个大写字母表示,比如 T,A,B 等等

说明

在语法里面,[] 表示可以有可以没有的语句,我们从语法里面看到,泛型可以使用在类里面的属性上面或者方法的参数或者返回值里面。

Java泛型对象声明语法

类名称<具体类> 对象名称 = new 类名称<具体类>();

参数

参数 描述
类名称 定义的范型类的类名称
具体类型 具体的想要方法里面的参数或者类里面的属性对应的类型的类名称

说明

在具体使用泛型类的时候,需要将具体的类声明。

案例

定义单个泛型类

package com.haicoder.net.paradigm; public class Point<T> { private T value; public T getValue() { return value; } public void setValue(T value) { this.value = value; } }

定义一个调用泛型的测试类

package com.haicoder.net.paradigm; public class TestParadigm { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Point<String> paramPoint = new Point<>() ; paramPoint.setValue("你好啊"); Point<Integer> integerPoint = new Point<>(); integerPoint.setValue(122); System.out.println("String value is :" + paramPoint.getValue()); System.out.println("Integer value is :" + integerPoint.getValue()); System.out.println("结束"); } }

运行结果如下:

01 泛型基础.png

我们按照定义泛型类的语法定义了一个 Point 泛型类,它的泛型标识符为 T。在使用该泛型类定义对象的时候,就会指定具体的类名称。这样在使用的时候,就知道具体对象类型了。

在对象设值的时候,设置的内容与泛型所指定的类型要一致,否则会编译报错。

定义多个泛型类

package com.haicoder.net.paradigm; public class Point<T,V> { private T key; private V value; public T getKey() { return key; } public void setKey(T key) { this.key = key; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } }

定义调用测试类

package com.haicoder.net.paradigm; public class TestParadigm { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Point<String, Integer> paramPoint = new Point<>() ; paramPoint.setKey("嗨客网年纪"); paramPoint.setValue(100); System.out.println(paramPoint.getKey() + " " + paramPoint.getValue()); System.out.println("结束"); } }

运行结果如下:

02 指定多个泛型类型.png

和指定单个泛型类不同之处在于我们定义对象的时候,会在类名后面的 <> 将对应的类依次填充在类里面,然后在使用的时候,就是按照声明的类型在使用。

Java泛型总结

如果一个类的具体使用类型不能够确定,想要用在多种类型上面,我们可以使用泛型。