了解了解Java泛型
泛型的概念
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型 或者是 某个方法的返回值类型及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法
泛型的意义
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。
Java 在引入泛型之前,表示可变对象,通常使用 Object 来实现,但是在进行类型强制转换时存在安全风险。有了泛型后:
-
编译期间确定类型,保证类型安全,放的是什么,取的也是什么,不用担心抛出 ClassCastException 异常。
-
提升可读性,从编码阶段就显式地知道泛型集合、泛型方法等处理的对象类型是什么。
-
泛型合并了同类型的处理代码提高代码的重用率,增加程序的通用灵活性。
示例:
public static void method1() {
List list = new ArrayList();
List.add(22);
List.add("hncboy");
List.add(new Object());
for (Object o : list) {
System.out.println(o.getClass());
}
}
未使用泛型前,我们对集合可以进行任意类型的 add 操作,遍历结果都被转换成 Object 类型,因为不确定集合里存放的具体类型,输出结果如下所示。
class java.lang.Integer
class java.lang.String
class java.lang.Object
采用泛型之后,创建集合对象可以明确的指定类型,在编译期间就确定了该集合存储的类型,存储其他类型的对象编译器会报错。这时遍历集合就可以直接采用明确的 String 类型输出。
public static void method2() {
List<String> list = new ArrayList();
list.add("22");
list.add("hncboy");
//list.add(new Object()); 报错
for (String s : arrayList) {
System.out.println(s);
}
}
泛型的使用
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
泛型的声明
例如interface List<T> 和class GenTest<K,V>
其中T,K,V表示泛指,代表类型。这里使用任意字母都可以。常用T表示,是Type的缩写
要在类名后面指定泛型
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
- T只能是类,不能用基本数据类型。可以使用包装类
- 使用泛型的主要优点是能够在编译时而不是在运行时检测错误
ArrayList<Integer> list = new ArrayList<>();//类型推断
list.add(78);
list.add(88);
list.add(77);
list.add(66);
//遍历方式一:
//for(Integer i : list){
//不需要强转
//System.out.println(i);
//}
//遍历方式二:
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Tom1",34);
map.put("Tom2",44);
map.put("Tom3",33);
map.put("Tom4",32);
//添加失败
//map.put(33, "Tom");
Set<Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Entry<String,Integer>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String,Integer> entry = iterator.next();
System.out.println(entry.getKey() + "--->" + entry.getValue());
}
相关推荐
深入了解JAVA泛型
**总结**Java泛型是一种强大的工具,它提高了代码的类型安全性,减少了类型转换的需要,并使代码更加可读和可维护。通过理解并熟练运用泛型,我们可以编写出更健壮、更灵活的Java应用程序。
一篇文章快速了解Java中的泛型
"Java泛型是自JDK1.5版本引入的一种强大的类型系统特性,旨在提高代码的类型安全性,减少类型转换,并增加代码的可读性和可维护性。通过泛型,程序员可以在编译时就确保代码只能使用指定类型的对象,避
java反射之通过反射了解集合泛型的本质(详解)
但在运行时,由于Java的类型擦除,集合泛型信息会被删除,这就是所谓的"去泛型化"。
Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)
泛型的主要优点是可以Reusable Code,让程序员编写更加灵活和可维护的代码。首先,让我们了解 Java 泛型的基本概念。
java 泛型方法使用示例
Java 泛型是Java SE 5.0引入的一项重要特性,极大地增强了代码的类型安全性和重用性。泛型方法是泛型技术在类方法层面的应用,它允许我们定义一个可以处理多种数据类型的通用方法。


