首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能使用带有List<SuperType>参数的List<SubType>调用函数

不能使用带有List<SuperType>参数的List<SubType>调用函数
EN

Stack Overflow用户
提问于 2014-02-13 14:08:32
回答 2查看 69关注 0票数 3

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

代码语言:javascript
复制
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();
        }
}

我不能打电话

使用:

代码语言:javascript
复制
List<AdminVO> adminVoList = new ArrayList<AdminVO>
Utils.getUserIdCSVs(adminVoList);

或使用:

代码语言:javascript
复制
List<UserVO> userVoList = new ArrayList<UserVO>
Utils.getUserIdCSVs(userVoList);

该函数编译正确。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-13 14:13:01

这是意料之中的:在Java中,基于同一层次结构的类不存在泛型类型的协方差。

如果你想一想,这是有道理的。考虑到这一点:

代码语言:javascript
复制
List<AdminVO> adminVoList = new ArrayList<AdminVO>();
Utils.addUser(adminVoList); // assume it expects ArrayList<Serializable>

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

代码语言:javascript
复制
static addUser(List<Serializable> users) {
    users.add(new UserV0("I am not an admin!"));
}

但是,由于users in addUser与其外部的adminVoList是相同的,所以最终在列表中出现了非admins,该列表应该由admins组成。

要处理这个限制,只需将adminVoList声明为

代码语言:javascript
复制
List<Serializable> adminVoList = new ArrayList<Serializable>();
票数 2
EN

Stack Overflow用户

发布于 2014-02-13 14:13:42

List<AdminVO>不是List<Serializable>的子类。

想象一下:

代码语言:javascript
复制
List<AdminVO> list = new LinkedList<>();
List<Serializable> myList = list;
myList.add(new SomeConcreteSerializable()); 
//list contains an element which is not of type AdminVO!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21756544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档