服务器测评网
我们一直在努力

泛型java怎么写?新手必看的详细教程与实例解析

泛型 Java 怎么写

泛型的基本概念

泛型(Generics)是 Java 5 引入的一项特性,它允许在定义类、接口或方法时使用类型参数,从而在编译时进行类型检查,避免类型转换异常,泛型的核心目标是提高代码的类型安全性,减少运行时错误,并增强代码的可重用性。

泛型java怎么写?新手必看的详细教程与实例解析

在 Java 中,泛型通过尖括号 <> 表示,List<String> 表示一个只能存储字符串的列表,泛型类型参数通常使用单个大写字母表示,如 E(Element)、T(Type)、K(Key)、V(Value)等。

List<String> stringList = new ArrayList<>();  
stringList.add("Hello");  
// stringList.add(123); // 编译错误,类型不匹配  

泛型的类和接口

泛型类是在类名后面加上类型参数,

public class Box<T> {  
    private T content;  
    public void setContent(T content) {  
        this.content = content;  
    }  
    public T getContent() {  
        return content;  
    }  
}  

使用时可以指定具体类型:

Box<Integer> integerBox = new Box<>();  
integerBox.setContent(100);  

泛型接口的定义与泛型类类似,

泛型java怎么写?新手必看的详细教程与实例解析

public interface Generator<T> {  
    T next();  
}  

泛型方法

泛型方法是在方法返回值前声明类型参数,与类是否为泛型无关。

public static <T> void printArray(T[] array) {  
    for (T element : array) {  
        System.out.println(element);  
    }  
}  

调用时可以显式指定类型或让编译器推断:

printArray(new String[]{"A", "B", "C"});  

通配符(Wildcards)

泛型通配符用于表示未知类型,主要有三种形式:

  1. 无界通配符 :表示任意类型,List<?> 可以接受任何 List
  2. 上界通配符 ? extends T:表示 T 或其子类,List<? extends Number> 可以接受 List<Integer>List<Double>
  3. 下界通配符 ? super T:表示 T 或其父类,List<? super Integer> 可以接受 List<Integer>List<Number>

示例:

泛型java怎么写?新手必看的详细教程与实例解析

public void processList(List<? extends Number> list) {  
    for (Number num : list) {  
        System.out.println(num);  
    }  
}  

泛型的类型擦除

Java 的泛型是“伪泛型”,在编译后类型信息会被擦除,即泛型类型在运行时会被替换为它的边界类型(如果没有边界则替换为 Object)。

  • List<String>List<Integer> 在编译后都会变成 List
  • 类型擦除会导致泛型无法直接使用 instanceof 或创建泛型数组,
    // List<String>[] listArray = new List<String>[10]; // 编译错误  

泛型的限制

  1. 不能创建泛型数组:因为类型擦除会导致数组类型不一致。
  2. 静态变量不能使用泛型类型:静态变量属于类级别,而泛型类型实例可能不同。
  3. 基本类型不能作为泛型类型参数:需要使用包装类,如 List<Integer> 而不是 List<int>
  4. 泛型类型参数不能用于异常类:不能抛出或捕获泛型异常。

泛型的最佳实践

  1. 优先使用泛型:在集合、工具类等场景中,使用泛型提高类型安全性。
  2. 避免过度使用通配符:仅在需要灵活处理多种类型时使用通配符。
  3. 合理设置边界:通过 extendssuper 限制泛型类型范围,增强代码健壮性。
  4. 注意类型擦除的影响:避免依赖运行时类型信息,例如反射时需额外处理。

示例代码

以下是一个综合示例,展示泛型类、方法和通配符的使用:

public class GenericDemo {  
    public static void main(String[] args) {  
        Box<String> stringBox = new Box<>();  
        stringBox.setContent("Hello Generics");  
        System.out.println(stringBox.getContent());  
        Box<Integer> integerBox = new Box<>();  
        integerBox.setContent(123);  
        System.out.println(integerBox.getContent());  
        String[] strArray = {"A", "B", "C"};  
        printArray(strArray);  
        List<Integer> intList = Arrays.asList(1, 2, 3);  
        processList(intList);  
    }  
    public static <T> void printArray(T[] array) {  
        for (T element : array) {  
            System.out.println(element);  
        }  
    }  
    public static void processList(List<? extends Number> list) {  
        for (Number num : list) {  
            System.out.println(num.doubleValue());  
        }  
    }  
}  

泛型是 Java 中强大的类型安全工具,通过类型参数、通配符和边界机制,能够显著提升代码的可读性、可维护性和健壮性,掌握泛型的基本概念、使用场景及限制,有助于编写更高质量的 Java 程序,在实际开发中,应根据需求合理设计泛型类和方法,避免滥用或误用泛型特性。

赞(0)
未经允许不得转载:好主机测评网 » 泛型java怎么写?新手必看的详细教程与实例解析