繁体   English   中英

Java泛型列表

[英]Java Generics List

以下是带有通配符的泛型示例

public static void printListItems(List<object> list) {
        for (Object listItem : list)
            System.out.println(listItem);
    }

在此示例中,我们希望打印任何类型的列表项,但不能打印List<Integer>List<String>等,因为它们不是List<Object>子类型。 使用无界通配符可以解决此问题。

public static void printListItems(List<?> list) {
    for (Object listItem : list)
        System.out.println(listItem);
}

我在Java教程中阅读了以上代码。 对于第一个示例,它说它不起作用,因为List<String>不是List<Object>

那么为什么要这样,在第二个示例中,for循环正在使用listItem作为Object dataType并遍历List<String>元素进行工作。

您正在遇到一个错误的矛盾,因为您将List<String>List<Object>之间的关系等同于StringObject之间的关系。

在第一个示例中,如果您尝试使用List<String>调用printListItem ,则编译器会大吼大叫,因为List<String>不扩展List<Object>

换句话说:字符串列表不能被视为对象列表,因为(根据类型系统)字符串列表不是对象列表。

在第二个示例中,编译器不会对您大吼大叫,因为您将ListString元素视为Object元素。 与列表不同, String确实扩展了Object

换句话说:字符串可以被视为对象,因为(根据类型系统)字符串对象。

generic class类型声明包含wildcard character ,其子类类型可以在二维中扩展。


例如Collection <?扩展数字>

  • 它的子类类型可以在维Collection中扩展,因为List and Set都是Collection子类类型,所以List<? extends Number> and Set<? extends Number> List<? extends Number> and Set<? extends Number> List<? extends Number> and Set<? extends Number>都是Collection<? extends Number>所有子类类型 Collection<? extends Number> Collection<? extends Number>
  • 它的子类类型可以在Number维度中扩展,因为Integer 、Double都是Number子类类型,因此Collection<Double> and Collection<Integer>都是Collection <?的子类 扩展Number>

关于您的第二个内容,正如Andreas 在评论中解释的那样,List等于List <? 扩展Object>并基于第二维,扩展List <String>是List <?>的**子类**

您所做的不是通用的。 这是一个通用功能

public static <T> void printListItems(List<T> list) {
    for (T listItem : list) {
        System.out.println(listItem);
    }
}

例:

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
    public static <T> void printListItems(List<T> list) {
        for (T listItem : list) {
            System.out.println(listItem);
        }
    }

    // arguments are passed using the text field below this editor
    public static void main(String[] args) {
        List<Integer> l = new ArrayList<>(Arrays.asList(1,2,3,4,5));
        List<String> s = new ArrayList<>(Arrays.asList("Hello", "World"));
        printListItems(l);
        printListItems(s);
    }
}

产量

1
2
3
4
5
Hello
World

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM