Java 无法使用列表调用函数<;超类型>;带有列表的参数<;亚型>;

Java 无法使用列表调用函数<;超类型>;带有列表的参数<;亚型>;,java,generics,collections,Java,Generics,Collections,我在Utils类中创建了以下函数: public class Utils{ public static String getUserIdCSVs(List<Serializable> voList) { StringBuilder csv = new StringBuilder(); if(voList != null){ for(Serializable serializable :voLis

我在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();
        }
}
公共类Utils{
公共静态字符串getUserIdCSVs(列表voList){
StringBuilder csv=新的StringBuilder();
如果(voList!=null){
for(可序列化可序列化:voList){
UserVO UserVO=null;
if(serializable!=null&&serializable instanceof AdminVO){
userVO=((AdminVO)可序列化).getUserVO();
}
if(serializable!=null&&serializable instanceof UserVO){
userVO=(userVO)可序列化;
}
追加(userVO.getUserId()+“,”);
}
}
返回csv.toString();
}
}
我不能打电话

使用:

List<AdminVO> adminVoList = new ArrayList<AdminVO>
Utils.getUserIdCSVs(adminVoList);
List adminVoList=new ArrayList
Utils.getUserIdCSVs(adminVoList);
或使用:

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

函数可以正确编译。

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

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

List<AdminVO> adminVoList = new ArrayList<AdminVO>();
Utils.addUser(adminVoList); // assume it expects ArrayList<Serializable>
但是,由于
users
内部的
addUser
与它外部的
adminVoList
相同,因此在假定由管理员组成的列表中,最终会出现非管理员

要处理此限制,只需将您的
adminVoList
声明为

List<Serializable> adminVoList = new ArrayList<Serializable>();
List adminVoList=new ArrayList();
列表
不是
列表
的子类

想象一下:

List<AdminVO> list = new LinkedList<>();
List<Serializable> myList = list;
myList.add(new SomeConcreteSerializable()); 
//list contains an element which is not of type AdminVO!
List List=newlinkedlist();
列表myList=List;
add(newsomeconcreteserializable());
//列表包含一个非AdminVO类型的元素!

我理解这个解决方案,但是
的意思是基于相同层次结构的类的泛型类型没有协方差。你能详细说明一下吗?@LearnMore其他语言允许你这样做,但有一些限制;该特征称为“通用类型协方差”。下面是一个解释细节的例子。
List<AdminVO> list = new LinkedList<>();
List<Serializable> myList = list;
myList.add(new SomeConcreteSerializable()); 
//list contains an element which is not of type AdminVO!