泛型是一种“代码模板”,可以用一套代码套用各种类型。
定义
泛型的定义,可以按照如下格式:
package com.sj;
public class Person<T> {
private T value;
public Person() {
}
public Person(T value) {
this.value = value;
}
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
// 静态方法,泛型使用方式不同,请注意。这里的“K”已经和泛型“T”不一样了
public static <K> Person<K> newInstance(K name) {
return new Person<K>(name);
}
}
T
就是泛型,此外,要注意类名后面一定要带着<T>
使用
import obj.person.Person;
public class TestWhatever {
public static void main(String[] args) {
// 泛型设置为String
Person<String> stringPerson = new Person<>();
stringPerson.setValue("秋佳");
String value = stringPerson.getValue();
// 泛型设置为Integer
Person<Integer> integerPerson = new Person<>();
integerPerson.setValue(95);
Integer value1 = integerPerson.getValue();
}
}
泛型可以看作是一种“代码模板”。示例中的Person
类,在创建对象时可以将泛型定义为任意类,则value
属性就可以是任意类型。可是如果在Person
类中,将value
类型设置为Object
,value
也可以是任意类型啊,那么为什么要使用泛型呢?这里就要提到泛型的另一个作用:限制类型。比如ArrayList
,我设置泛型为String
,则你只能为ArrayList
中添加String
类型的值,如果为它添加其他类型的值,编译器就会报错。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add(new Person<Boolean>()); // 编译器报错
}
此外,当你指定泛型之后,在取值的时候,也不需要强制转换类型。例如:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
String s = list.get(0);
}