gpt4 book ai didi

Java 通用列表>

转载 作者:IT老高 更新时间:2023-10-28 20:46:28 25 4
gpt4 key购买 nike

为什么我们不能在java中做:

List<List<? extends Number>> aList = new ArrayList<List<Number>>();

即使这样也可以:

List<? extends Number> aList = new ArrayList<Number>();

编译器错误信息是:

Type mismatch: cannot convert from ArrayList<List<Number>> to List<List<? extends Number>>

最佳答案

在 Java 中,如果 CarVehicle 的派生类,那么我们可以处理所有 Cars作为 Vehicles ;一个 CarVehicle . 但是,ListCars也不是ListVehicles .我们说List<Car> List<Vehicle> 不协变 .

Java 要求您明确告诉它何时要使用通配符的协变和逆变,由 ? 表示 token 。看看你的问题发生在哪里:

List<List<? extends Number>> l = new ArrayList<List<Number>>();
// ---------------- ------
//
// "? extends Number" matched by "Number". Success!

List<? extends Number>工作是因为 Number确实扩展了Number ,所以它匹配“? extends Number”。到目前为止,一切都很好。下一步是什么?

List<List<? extends Number>> l = new ArrayList<List<Number>>();
// ---------------------- ------------
//
// "List<? extends Number>" not matched by "List<Number>". These are
// different types and covariance is not specified with a wildcard.
// Failure.

但是,组合的内部类型参数 List<? extends Number>List<Number> 不匹配;类型必须完全相同。另一个通配符会告诉 Java 这种组合类型也应该是协变的:

List<? extends List<? extends Number>> l = new ArrayList<List<Number>>();

关于Java 通用列表<List<?扩展号码>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/746089/

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