java - 如何遍历 Object 引用的数组?
问题描述
我有一个基于识别字符串get(String)
返回的函数。Object
有时,Object
返回的 fromget
是一个数组。如果是这样,我想遍历每个数组元素并以某种方式处理该元素。类似于以下代码。
Object object = get(identifier);
if(object.getClass().isArray())
processArray(object);
void processArray(Object array) {
//For each element in the array, do something
}
我对此的尝试解决方案类似于
void processArray(Object array) {
Object[] arrayCasted = (Object[]) array;
for(Object arrayElement : arrayCasted)
//Process each element somehow
}
但这仅适用于对象数组(而不是原始数组)
Integer[] test1 = {1, 2, 3};
int[] test2 = {1, 2, 3};
processArray(test1); //Works
processArray(test2); //Does not work: ClassCastException
无论如何processArray
都可以为所有阵列工作吗?
解决方案
使用java.lang.reflect.Array
是关键。如果您有一个Object
which 实际上是某种类型的数组(原始、字符串或某种自定义类型等),您可以在不知道其类型或进行类型转换等的情况下迭代、打印等。
由于元素Object[]
不是类型,因此无法进行类型转换,但是,您可以通过了解其组件类型 ( )Object
将其类型转换为特定类型的数组。obj.getClass().getComponentType()
然而,java.lang.reflect.Array
基于解决方案更清洁。
import java.lang.reflect.Array;
public class ArrayOfUnknownType {
public static void main(String[] args) {
int[] i = {1, 2, 3};
String[] s = {"a", "b", "c"};
Dog[] d = {new Dog("d"), new Dog("e")};
process(i);
process(s);
process(d);
}
private static void process(Object data) {
System.out.println(data.getClass().getComponentType());
if(data.getClass().isArray()) {
int length = Array.getLength(data);
for(int count =0; count < length; count++ ){
System.out.println(Array.get(data, count));
}
}
}
private static class Dog {
public String name;
public Dog(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}
}
推荐阅读
- python - 我如何知道调用当前函数的按钮的名称?
- tfs - 如何管理解决方案项目中的访问权限
- php - 如何使用数组中的对象(php)?
- python - 使用自定义用户模型在 django 的作者字段中自动添加用户名
- php - Laravel 5.8 自定义验证器解析器不工作
- docker - Docker(windows):docker container ls / docker image list突然什么也没显示
- python - Sympy矩阵中的浮点数而不是分数?
- c# - 如何使用图像的字节流在 C# 中通过 Slack-App 在 Slack 上上传图像
- c# - Rider 建议使用 C# 8 语法,但未能构建解决方案
- python - 我正在构建一个集成深度学习模型,它需要两个输入,当我连接它时会出错