详解 Java 泛型:核心概念与实用示例

简介: 详解 Java 泛型:核心概念与实用示例

详解 Java 泛型:核心概念与实用示例

Java 泛型(Generics)是Java SE 5引入的一项特性,旨在提高代码的可重用性和类型安全性。通过泛型,开发者可以编写一个通用的类、接口或方法,可以与多种类型一起工作,而不需要为每种类型创建不同的版本。

泛型的核心概念

泛型类(Generic Class)

泛型类是包含一个或多个类型参数的类。例如:

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

这里,T 是类型参数,可以在创建 Box 对象时指定具体的类型:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");

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

泛型方法(Generic Method):

泛型方法是包含类型参数的方法。类型参数在方法的声明中被指定。例如:

public class GenericMethodExample {

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

    public static void main(String[] args) {
        Integer[] intArray = {1, 2, 3, 4};
        String[] stringArray = {"A", "B", "C"};

        printArray(intArray);
        printArray(stringArray);
    }
}

泛型接口(Generic Interface):

泛型接口和泛型类类似。它们允许类型参数在接口中使用。例如:

public interface Pair<K, V> {
    K getKey();
    V getValue();
}

public class OrderedPair<K, V> implements Pair<K, V> {
    private K key;
    private V value;

    public OrderedPair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}

类型通配符(Wildcard):

泛型中的通配符用于表示未知类型。通配符有三种形式:

  • 无限制通配符(?):表示任何类型。
public void printList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}
  • 有上限的通配符(? extends Type):表示类型是 Type 或其子类。
public void processList(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}
  • 有下限的通配符(? super Type):表示类型是 Type 或其父类。
public void addNumber(List<? super Integer> list) {
    list.add(new Integer(123));
}

类型擦除(Type Erasure):

泛型在编译时会进行类型擦除,这意味着泛型类型在运行时被移除,并替换为其限定类型(如果未指定,则为 Object)。这使得泛型可以与非泛型代码互操作。

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

编译后:

public class Box {
    private Object content;

    public void setContent(Object content) {
        this.content = content;
    }

    public Object getContent() {
        return content;
    }
}

使用泛型的注意事项

不能创建泛型类型的实例

public class Box<T> {
    // T t = new T(); // 错误:不能直接创建泛型类型的实例
}

静态成员不能使用类型参数

public class Box<T> {
    // private static T content; // 错误:静态变量不能使用类型参数
}

泛型数组创建受限

public class Box<T> {
    // T[] array = new T[10]; // 错误:不能直接创建泛型数组
}

示例:使用泛型的栈

public class GenericStack<T> {
    private List<T> stack = new ArrayList<>();

    public void push(T element) {
        stack.add(element);
    }

    public T pop() {
        if (!stack.isEmpty()) {
            return stack.remove(stack.size() - 1);
        }
        return null;
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        GenericStack<String> stringStack = new GenericStack<>();
        stringStack.push("Hello");
        stringStack.push("World");
        System.out.println(stringStack.pop()); // 输出:World

        GenericStack<Integer> intStack = new GenericStack<>();
        intStack.push(1);
        intStack.push(2);
        System.out.println(intStack.pop()); // 输出:2
    }
}

结论

Java 泛型提供了一种类型安全的方式来实现通用编程。它们不仅提高了代码的可读性和可维护性,还避免了类型转换的错误。在编写通用类、接口和方法时,泛型是一个强大的工具。

目录
相关文章
|
11天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
1月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
44 1
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
70 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
24天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
37 1
|
29天前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
25 0
[Java]泛型
|
1月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 1
|
1月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
46 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
27 1
|
1月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
27 5
|
1月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
19 1
下一篇
无影云桌面