Java 动态设置 List 泛型

在 Java 中,我们经常使用泛型来增加代码的灵活性和可读性。泛型可以让我们在编译时检查和处理不同类型的数据,避免类型转换错误和运行时异常。通常情况下,我们在定义 List 类型时会指定泛型的具体类型,例如 List<String> 表示一个存储字符串的列表。然而,有时候我们需要在运行时才能确定泛型的具体类型,这就需要动态设置 List 泛型。

动态设置 List 泛型的需求

动态设置 List 泛型的需求主要来自于以下场景:

  1. 当我们需要在运行时根据一些条件来确定 List 的泛型类型。
  2. 当我们需要将不同类型的对象存储在同一个 List 中,并且能正确地处理这些对象。

使用通配符

Java 中提供了通配符(Wildcard)来解决动态设置 List 泛型的问题。通配符表示一个未知类型,使用 ? 表示。我们可以通过使用通配符来实现将不同类型的对象存储在同一个 List 中。

通配符有两种形式:无界通配符和有界通配符。

无界通配符

无界通配符表示不限制泛型的具体类型,使用 <?> 表示。它可以接受任意类型的对象。

示例代码如下:

List<?> list = new ArrayList<>();
list.add("Hello");
list.add(123);
list.add(new Object());

for (Object item : list) {
    System.out.println(item);
}

在上面的代码中,我们定义了一个存储未知类型的 List。我们可以向其中添加任意类型的对象,并且可以通过遍历 List 来处理这些对象。

有界通配符

有界通配符表示泛型的具体类型必须是某个类型或其子类型,使用 <? extends 类型> 来表示。

示例代码如下:

List<? extends Number> list = new ArrayList<>();
list.add(123); // 编译错误
list.add(3.14); // 编译错误

Number n = list.get(0);

在上面的代码中,我们定义了一个存储 Number 类型或其子类型的 List。我们无法向其中添加任意类型的对象,但可以从中获取元素并赋值给 Number 类型的变量。

使用泛型方法

除了使用通配符,我们还可以使用泛型方法来实现动态设置 List 泛型。

示例代码如下:

public class ListUtils {
    public static <T> List<T> createList() {
        return new ArrayList<>();
    }

    public static void main(String[] args) {
        List<String> stringList = ListUtils.createList();
        List<Integer> integerList = ListUtils.createList();
    }
}

在上面的代码中,我们定义了一个泛型方法 createList(),它返回一个泛型类型的 List。我们可以在调用方法时指定泛型的具体类型,从而动态设置 List 的泛型。

总结

动态设置 List 泛型是 Java 中处理不同类型数据的重要技巧之一。通过使用通配符或泛型方法,我们可以灵活地处理不同类型的对象,并且能够在编译时进行类型检查,避免错误和异常。

在使用动态设置 List 泛型时,需要注意以下几点:

  1. 无界通配符可以接受任意类型的对象,但无法添加元素或获取元素的具体类型。
  2. 有界通配符可以限制泛型类型的范围,并且可以获取元素并赋值给具体类型。
  3. 泛型方法可以在调用时指定泛型的具体类型,从而动态设置 List 的泛型。

通过灵活运用这些技巧,我们可以更好地处理不同类型的数据,增加代码的灵活性和可读性。

参考链接:

  • [Java Generics](
  • [Java Wildcards](