gpt4 book ai didi

java - 为什么 Java 编译器知道你想对数组做什么,但不知道你想对泛型做什么?

转载 作者:行者123 更新时间:2023-12-01 21:15:39 25 4
gpt4 key购买 nike

我正在阅读 Thinking in Java 第 4 版,在泛型一章中,我发现了这些句子:本段解释了为什么数组支持协方差但泛型不支持。

The real issue is that we are talking about the type of the container, rather than the type that the container is holding. Unlike arrays, generics do not have built-in covariance. This is because arrays are completely defined in the language and can thus have both compile-time and run-time checks built in,but with generics, the compiler and runtime system cannot know what you want to do with your types and what the rules should be.

但是我真的无法理解这一段的意思,为什么编译器知道你想对数组做什么,但不知道你想对泛型做什么?谁能给我举个例子吗?

最佳答案

首先,引用的内容非常不清楚。数组和泛型都是“完全在语言中定义的”,尽管方式不同。编译器和运行时系统都无法读懂你的想法,因此不知道“你想用你的类型做什么”。

这句话似乎指的是数组是具体化的,而泛型则不是:在运行时, List 的元素类型未知,但数组的元素类型已知。即:在运行时,都是 List<String>和一个 List<Integer>具有相同的类型(a List ),而 String[]和一个Integer[]不同类型。然而,在编译时,List<String>List<Integer>是不同的类型。

造成这种情况的原因主要是历史原因。数组是在 Java 的第一个版本中引入的,没有理由不让数组的元素类型在运行时已知。然而,当 Java 5 中引入泛型时,目标是使新的 Java 代码与旧的 Java 代码兼容(反之亦然),因此必须在运行时删除泛型。

关于java - 为什么 Java 编译器知道你想对数组做什么,但不知道你想对泛型做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40212582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com