我有一个用例,其中一个数组作为Object传递。我必须在运行时弄清楚数组的类型并生成相同类型的列表。
public class Test {
public static Object getArray(Object value) {
Object returnVal = value;
if(value!=null && value.getClass().isArray()){
returnVal = Arrays.asList(value).get(0);
}
return returnVal;
}
public static void main(String[] args) {
int[] k = new int[]{1,2,3,4,43,4};
Object val = getArray(k);
// val should be 1st element of the array. So, val should be equal to 1.
}
}
如果我运行以下代码,我将得到一个结果作为List,并将完整数组作为第一个元素。
我只需要返回数组的第一个元素。
传递的值可以是任何值,因此我无法更改返回类型。
答案 0 :(得分:1)
除非您将value
强制转换为Object[]
数组,否则将使用单个元素(值本身)调用Arrays.asList(...)
。
但是,您的代码没有显示与您的问题相同的意图:看起来您正在尝试返回该对象(如果它不是数组) 或数组的第一个元素(如果value
是数组)。如果是这样,您根本不需要列表。并且您可以使用Optional
为其提供流畅的新外观(当然,如果没有Optional
,您可以实现相同的目标):
return Optional.ofNullable(value)
.filter(Object[]::isInstance) // if value is an array
.map(Object[].class::cast) // cast to an Object[] array
.filter(arr -> arr.length > 0) // ensure non-empty
.map(arr -> arr[0]) // grab the first element
.orElse(value); // fallback to returning the raw value
唯一尴尬的边缘情况是一个空数组,它将被返回。
答案 1 :(得分:1)
我解决了你的问题:
import java.lang.reflect;
public static Object getArray(Object value){
if (value != null && value.getClass().isArray()){
return Array.getLength(value) == 0 ? null : Array.get(value, 0);
}
return value;
}
如果您确定数组的长度不能为零,您可以像这样编写return语句:
return Array.get(value, 0);
答案 2 :(得分:0)
您无法创建仅在运行时已知的类型的列表。
您可以使用以下方法找到阵列的类型:
value.getClass().getComponentType()
但由于运行时类型擦除,列表在运行时没有类型,因此无论您是否知道数组的类型都无关紧要。
答案 3 :(得分:0)
public static Object[] getArray(Object value) {
return value != null && !value.getClass().isArray()
? new Object[] { value }
: (Object[]) value;
}
如果对象不是数组,则将其包装在数组中,否则将其强制转换为数组。
你可以创建一个 checked 类型的列表,但遗憾的是你在编译时需要一个Class<T>
参数来进行类型安全性检查。
Object[] array = (Object[]) value;
List<?> list = Collections.checkedList(Arrays.asList(array), value.getComponentType());