gpt4 book ai didi

java - 将元素添加到不可变列表时出错

转载 作者:行者123 更新时间:2023-12-01 17:16:41 25 4
gpt4 key购买 nike

以下代码片段无法编译(给出错误报告不兼容的类型):

private static List<IGrupoSituacoesPermitidas> grupoSituacoesPermitidas = ImmutableList.of(new GrupoSituacoesPermitidasDI());

但是如果我向列表中添加更多元素,如下面的代码所示

private static List<IGrupoSituacoesPermitidas> grupoSituacoesPermitidas = ImmutableList.of(new GrupoSituacoesPermitidasDI(), new GrupoSituacoesPermitidasDV());

编译没有问题。

谁能告诉我为什么会发生这种情况以及如何在不强制转换的情况下解决这个问题?

最佳答案

当您传递单个参数时 - new GrupoSituacoesPermitidasDI() ,类型参数E通用方法的值被推断为 GrupoSituacoesPermitidasDI ,因此它将返回 List<GrupoSituacoesPermitidasDI> ,它不是 List<IGrupoSituacoesPermitidas> 的子类型,因此会出现编译器错误。

现在,如果您查看重载方法的签名,您会发现它需要 2 个 E 类型的参数。 。因此,您的论点应该属于同一类型。如果不是,编译器会将该类型推断为您传递的参数的公共(public)父类(super class)型。

因此,由于您传递了两个不同的差异参数,因此类型参数被推断为这些类型的公共(public)父类(super class)型,我猜是 IGrupoSituacoesPermitidas ,因此列表返回为 List<IGrupoSituacoesPermitidas> ,那很好。

这是一个简单的示例,它重现了该问题:

class Vehicle { }
class Car extends Vehicle { }
class Bike extends Vehicle { }


public static <T> List<T> of(T obj) {
List<T> list = new ArrayList<T>();
list.add(obj);
return list;
}

public static <T> List<T> of(T obj1, T obj2) {
List<T> list = new ArrayList<T>();
list.add(obj1);
list.add(obj2);
return list;
}

public static void main(String... args) {
List<Vehicle> vehicles = of(new Car()); // Doesn't work
List<Vehicle> vehicles1 = of(new Vehicle()); // Works
List<Vehicle> vehicles2 = of(new Car(), new Bike());
}

这就是类型推断的工作原理。如果两个类型不相同,则推断出共同的父类(super class)型。另外,从@Marko的评论来看,如果假设你的类也实现了 Serializable ,那么类型参数将被推断为:

Vehicle & Serializable

然后,这又会失败,如 List<Vehicle>不是 List<T2> 的父类(super class)型哪里T2有以上两个界限。

您可以通过给出显式类型参数来解决此类问题:

private static List<IGrupoSituacoesPermitidas> grupoSituacoesPermitidas = 
ImmutableList.<IGrupoSituacoesPermitidas>of(new GrupoSituacoesPermitidasDI());

关于java - 将元素添加到不可变列表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21604132/

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