java - 如何将多种类型的 ArrayList 传递给 Java 中的函数?
问题描述
我有多个不同类型的 ArrayList,如何将它们传递给单个函数?
例如,
ArrayList<String> mStringList = new ArrayList<>();
ArrayList<Interge> mIntList = new ArrayList<>();
passArraylist(0,mStringList)
passArraylist(1,mIntList )
private void passArraylist(int tag , ArrayList<?> list){
if(tag == 0){
//how to change list to ArrayList<String>
}else if(tag == 1){
//how to change list to ArrayList<Interge>
}
}
如何将不同类型的 ArrayList 传递给单个函数并在函数中获取正确的类型?
解决方案
当你想传递你使用的不同类型的对象时Generics
,但取决于你打算做什么,最好为每种类型使用单独的方法。
但是,您在这里遇到的是 编译时的类型擦除Java Generics
,因此您不再知道传递了哪种类型的列表。
您的方法应该使用如下的强制转换来实现,但是它不是类型安全的。
这意味着您可以通过错误的列表传递错误的标签。
public static void main(String[] args) {
List<String> mStringList = new ArrayList<String>();
List<Integer> mIntList = new ArrayList<Integer>();
// Your method, but type safety is lost.
passArraylist(0, mStringList);
passArraylist(1, mIntList);
passArraylist(0, mIntList); -> compiles, but will cause a RuntimeException
}
private void passArraylist(int tag, List<?> list){
if(tag == 0){
List<String> stringList = (List<String>) list;
String item = stringList.get(0);
System.out.println("with value ["+ item +"] and type ["+ item.getClass() +"]");
}else if(tag == 1){
List<Integer> intList = (List<Integer>) list;
Integer item = intList.get(0);
System.out.println("with value ["+ item +"] and type ["+ item.getClass() +"]");
}
}
最好使用以下方法来获得类型安全。
这意味着如果您传递 a List<String>
,它将被用作 aList<String>
并且该get
方法将自动返回一个String
对象。
public static void main(String[] args) {
List<String> mStringList = new ArrayList<String>();
List<Integer> mIntList = new ArrayList<Integer>();
// New method, with type safety.
passArraylist(mStringList, String.class);
passArraylist(mIntList, Integer.class);
passArraylist(mIntList, String.class); -> won't compile
}
private <T> void passArraylist(List<T> list, Class<T> clazz){
if(clazz == String.class){
System.out.print("Print my String ");
}else if(clazz == Integer.class){
System.out.print("Print my Integer ");
}
T item = list.get(0);
System.out.println("with value ["+ item +"] and type ["+ item.getClass() +"]");
}
您希望在方法中获得的实际功能并不完全清楚,因此这可能不是您所需要的。在这种情况下,详细说明您的方法应该完成什么,我们将从那里继续。
推荐阅读
- python - 从 span 标签上方的文本节点获取文本
- javascript - 如何使用 Node.js 读取具有不同名称的文件?
- r - 如何将数据框的一行与向量值绘制为曲线?
- python - 在数据框中创建条件
- javascript - JavaScript 中的 If 条件存在一些问题
- docker - Docker,将容器的文件链接到主机
- android - 使用动画将视图从随机 x 和 y 位置移动到特定的 X 和 Y 位置
- php - 如何在声明数组php中添加if函数
- syntax - 如何在 MMT 中给出绝对 URI?获取“未绑定令牌:http”和“格式错误的常量引用”
- javascript - 将 XML 数据解析为 JSON(或数组) - Javascript/React