Java 泛型详解与范例
什么是Java泛型
泛型(Generics)是Java SE 1.5中引入的一种新特性,主要用来解决类型安全和类型转换的问题。泛型在编译时进行类型检查,提高了程序的健壮性和可读性,并且减少了代码的重复。
泛型的定义
泛型定义形式为<T>
,其中T为类型参数。通过T来表示任意一种类型,所以可以使用T来代替具体的类型。在Java中,我们经常使用<E>
表示集合元素的类型,使用<K>
和<V>
分别表示Map中的键和值类型。
泛型的作用
Java泛型的主要作用是提高程序的健壮性和可读性,防止在编译期间出现类型转换异常。比如我们在使用集合时,如果没有使用泛型,就必须手动将集合中的元素进行类型转换,这样容易出现类型转换异常。使用泛型可以避免这种问题。
泛型的使用
泛型类
泛型类就是定义了一个带有类型参数的类。在类中使用泛型类型时,需要在类名后面添加类型参数,例如:public class MyClass<T> { }
。T是类型参数,可以在类内部使用。
public class MyList<T> {
private List<T> list = new ArrayList<T>();
public void add(T t) {
list.add(t);
}
public T get(int index) {
return list.get(index);
}
}
泛型方法
泛型方法是在方法中定义了一个或多个类型参数的方法。这些类型参数与类的类型参数没有关系,可以定义和使用自己的类型形参,例如:public <T> void myMethod(T t) { }
。
public class MyList {
private List list = new ArrayList();
public void add(Object obj) {
list.add(obj);
}
public <T> T get(int index) {
return (T) list.get(index);
}
}
泛型通配符
有时候我们不确定使用的泛型类型的具体类别,此时可以使用泛型通配符。泛型通配符的符号为:?
,例如:List<?> list = new ArrayList<String>()
。这样,我们就可以将不同类型的集合赋值给list
变量。
public void processList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
示例说明
示例一:泛型类的实现
public class MyList<T> {
private List<T> list = new ArrayList<T>();
public void add(T t) {
list.add(t);
}
public T get(int index) {
return list.get(index);
}
}
public static void main(String[] args) {
MyList<String> list = new MyList<String>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list.get(0));
}
以上示例代码实现了一个泛型类MyList,可以添加任意类型的元素,同时可以获取指定索引位置的元素。可以看到,在创建实例对象时,需要指定类型参数,这里的类型参数是String。
示例二:泛型方法的使用
public class MyList {
private List list = new ArrayList();
public void add(Object obj) {
list.add(obj);
}
public <T> T get(int index) {
return (T) list.get(index);
}
}
public static void main(String[] args) {
MyList list = new MyList();
list.add(1);
list.add("a");
int a = list.get(0); // 此处会报错
String b = list.get(1);
}
以上示例代码实现了一个泛型方法get,可以获取指定索引位置的元素,返回值类型是Object类型,但是在方法名前面添加了类型参数T。在调用这个方法时,我们可以将返回值进行类型转换。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 泛型详解与范例 - Python技术站