您的位置:

Java泛型的使用

Java泛型是在JDK1.5中引入的特性,它可以让我们在编译时就能够检测到类型的错误,同时也可以避免类转换的麻烦。在开发中,我们经常会遇到需要使用泛型的情况,接下来我们将从多个方面对Java泛型的使用进行详细的阐述。

一、泛型基础

1、泛型类型


public class GenericClass<T> {
    private T genericVariable;

    public GenericClass(T genericVariable) {
        this.genericVariable = genericVariable;
    }

    public T getGenericVariable() {
        return genericVariable;
    }

    public void setGenericVariable(T genericVariable) {
        this.genericVariable = genericVariable;
    }
}

2、通配符


public void process(List<? extends Number> list){
    //do something
}

3、类型擦除

Java泛型在编译期间会被擦除,并且会被替换成原生类型。比如,下面的代码:


List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

在编译后会变成这样:


List list = new ArrayList();
list.add(Integer.valueOf(1));
list.add(Integer.valueOf(2));

二、泛型高级特性

1、泛型方法


public <T> T getObject(Class<T> clazz) throws IllegalAccessException, InstantiationException{
    return clazz.newInstance();
}

2、泛型接口


public interface GenericInterface<T> {
    T getGenericVariable();
    void setGenericVariable(T genericVariable);
}

3、泛型类的继承

泛型类可以进行继承,并且可以在继承时指定具体的类型。


public class SubGenericClass<T> extends GenericClass<T> {
    public SubGenericClass(T genericVariable) {
        super(genericVariable);
    }
}

三、泛型实践

1、泛型集合的使用


List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");

for(String s: list){
    System.out.println(s);
}

2、泛型方法的使用


public <T> T getObject(Class<T> clazz) throws IllegalAccessException, InstantiationException{
    return clazz.newInstance();
}

String s = getObject(String.class);

3、泛型实现接口的使用


public interface GenericInterface<T> {
    T getGenericVariable();
    void setGenericVariable(T genericVariable);
}

public class GenericClass<T> implements GenericInterface<T> {
    private T genericVariable;

    public GenericClass(T genericVariable) {
        this.genericVariable = genericVariable;
    }

    public T getGenericVariable() {
        return genericVariable;
    }

    public void setGenericVariable(T genericVariable) {
        this.genericVariable = genericVariable;
    }
}

四、泛型注意事项

1、泛型不能用于基本类型


List<int> list = new ArrayList<>();  //编译错误
List<Integer> list = new ArrayList<>();  //正确的写法

2、泛型数组的创建


List<String>[] listArray = new List[10];  //编译错误
List<String>[] listArray = (List<String>[])new List[10];  //正确的写法

3、泛型不支持类型的运行时判断


List<String> list = new ArrayList<>();

if(list instanceof List<String>){
    //编译错误,无法判断泛型类型
}

if(list instanceof List){
    //正确的写法
}

4、泛型继承时只能继承原生类型


List<String> list = new ArrayList<>();
List<Object> objectList = new ArrayList<>();

objectList = list; //编译错误

以上就是Java泛型的基础知识、高级特性、实践方法以及注意事项的详细阐述,希望可以帮助到大家。