gpt4 book ai didi

java - 无法使用带有 List 的 List 参数调用函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:49:13 24 4
gpt4 key购买 nike

我在 Utils 类中创建了以下函数:

public class Utils{
public static String getUserIdCSVs(List<Serializable> voList) {
StringBuilder csv = new StringBuilder();
if(voList != null){
for(Serializable serializable :voList){
UserVO userVO = null;
if(serializable != null && serializable instanceof AdminVO){
userVO = ((AdminVO)serializable).getUserVO();
}
if(serializable != null && serializable instanceof UserVO){
userVO = (UserVO)serializable;
}
csv.append(userVO.getUserId()+",");
}
}
return csv.toString();
}
}

我不能打电话

使用:

List<AdminVO> adminVoList = new ArrayList<AdminVO>
Utils.getUserIdCSVs(adminVoList);

或使用:

List<UserVO> userVoList = new ArrayList<UserVO>
Utils.getUserIdCSVs(userVoList);

函数编译正确。

最佳答案

这是意料之中的:在 Java 中,基于同一层次结构中的类的泛型类型没有协变。

如果你仔细想想,这是有道理的。考虑一下:

List<AdminVO> adminVoList = new ArrayList<AdminVO>();
Utils.addUser(adminVoList); // assume it expects ArrayList<Serializable>

现在 Utils.addUser 可以自由添加 UserVO(或任何其他 Serializable)到管理员列表,这违反了原始列表的类型:

static addUser(List<Serializable> users) {
users.add(new UserV0("I am not an admin!"));
}

但是,由于 addUser 内部的 users 与外部的 adminVoList 相同,因此您最终会在列表中找到非管理员应该由管理员组成。

要解决此限制,只需将您的 adminVoList 声明为

List<Serializable> adminVoList = new ArrayList<Serializable>();

关于java - 无法使用带有 List<SubType> 的 List<SuperType> 参数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756544/

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