当前位置: 首页 > 知识库问答 >
问题:

流中的Java泛型

傅翰池
2023-03-14

我知道你用

假设有动物超类和狗猫子类。基本上我想要一个包含狗和猫的列表。我发现我可以做到以下几点:

List<? extends Animal> animalList;
List<Dog> dogList = getDogs();
List<Cat> catList = getCats();

animalList = Stream.concat(dogList.stream(), catList.stream()).collect(Collectors.toList())

// Do things according to its type
for (Animal animal : animalList) {
    if (animal instance of Dog) {...}
    if (animal instance of Cat) {...}
}

上面的代码可以编译。那么,它是否违反了我为动物主义者写价值观的规则?

共有1个答案

能向晨
2023-03-14

流。concat(dogList.stream(),catList。stream())。collect(Collectors.toList())

这将创建一个List

List<Animal> = ... all that ...

很好。

列表

?的'point'扩展了以及处理列表本身时的所有内容,而不是其中的内容。具体原因如下:

List<Animal> x = new ArrayList<Cat>();
x.add(new Dog());
Cat z = x.get(0);

对上面的代码进行三次检查,但它确切地解释了为什么?扩展(和?超级)存在。泛型必须是不变的,否则任何东西都会导致错误的代码。上面的代码不能编译,因为它没有意义。正如所写的,它确实不能编译——第1行是不允许的。您可以通过编写列表来使其工作

不同之处在于:

列表

列表

你分配你的List

 类似资料:
  • 我有一个下面的课: } 我的所有类都有一个名为ID的属性,它是类型UUID,所以比较器应该可以在所有泛型类型中正常工作。问题是我不知道如何编写collectors.groupingby的函数和supplier代码,因为第二个代码片段给出了编译错误。

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个

  • 问题内容: 假设您有一个arraylist定义如下: 稍后在代码中,由于泛型,您可以这样说: 而且编译器完全知道它将得到一个字符串。是的仿制药!但是,这将失败: 将始终返回对象数组,而不是已定义的泛型数组。为什么该方法知道返回的内容,但默认为Objects? 问题答案: 如果你看一下执行的的ArrayList 类,它是这样的: 这种方法的问题是您需要传递相同泛型的数组。现在考虑如果此方法不带任何参

  • 本文向大家介绍Java中的泛型详解,包括了Java中的泛型详解的使用技巧和注意事项,需要的朋友参考一下 所谓泛型:就是允许在定义类、接口指定类型形参,这个类型形参在将在声明变量、创建对象时确定(即传入实际的类型参数,也可称为类型实参) 泛型类或接口 “菱形”语法 从泛型类派生子类 伪泛型 不存在真正的泛型类,泛型类对Java虚拟机来说是透明的.JVM并不知道泛型类的存在,换句话来说,JVM处理泛型