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泛型的基础知识、高级特性、实践方法以及注意事项的详细阐述,希望可以帮助到大家。