一般的类和方法,只能够使用具体的类型。要么是基本类型,要么是自己定义的类。如果要编写可以应用于多种类型的代码,那么怎么办呢?
你会想到我们之前讲过的 Object 这个在 Java 语言中万类之父。它可以表示任何一个对象。它虽然可以,但是在使用的时候,如果控制不好,它容易发生问题,导致系统异常。
比如我们在一个对象里面声明了两个变量,两个变量的类型是一样的,都是数字类型,如果这个时候定义成 Object 类型,那么在给两个属性赋值的时候,具体的值类型就不可控了。
有可能是 String 类型,有可能是 Long 类型,这样的话代码就不是安全的了,会容易发生异常。所以就用泛型来处理这样的情况。
[访问权限] class 类名称<范型标识符 1,泛型标识符 2,... ,泛型标识符n>{
[访问权限] 泛型类型标识符 变量名称;
[访问权限] 泛型类型标识符 方法名称(){};
[访问权限] 返回值类型声明 方法名称(泛型类型标识 变量名称){};
}
参数 | 描述 |
---|---|
访问权限 | java 语言里面的四种访问权限 private、default、protected、public |
范型标识符 | 自定义的范型名称,任意字母都可以,一般我门用一个大写字母表示,比如 T,A,B 等等 |
在语法里面,[] 表示可以有可以没有的语句,我们从语法里面看到,泛型可以使用在类里面的属性上面或者方法的参数或者返回值里面。
类名称<具体类> 对象名称 = 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("结束");
}
}
运行结果如下:
我们按照定义泛型类的语法定义了一个 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("结束");
}
}
运行结果如下:
和指定单个泛型类不同之处在于我们定义对象的时候,会在类名后面的 <> 将对应的类依次填充在类里面,然后在使用的时候,就是按照声明的类型在使用。
如果一个类的具体使用类型不能够确定,想要用在多种类型上面,我们可以使用泛型。