Java 无法使用列表调用函数<;超类型>;带有列表的参数<;亚型>;
我在Utils类中创建了以下函数: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
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!