簡體   English   中英

將對象轉換為數組

[英]Cast Object to Array

所以我有一個可能是數組的對象。 它也可以是原始的或字符串。 如果它是一個數組,它可以是一個字面上的任何數組。

我沒有問題弄清楚它是否是一個數組,但我似乎無法將它轉換為任何我可以迭代以獲取值的東西。

// o is an object and clazz is the class of the o
if (clazz == Array.class) {
            Class ofArray = o.getClass().getComponentType();
            String arrayType = ofArray.getName(); // 'Double' for my test case
            //ERROR: [D cannot be cast to [Ljava.lang.Object 
            Object[] objects = (Object[]) o; 
    }

我的背景是在ruby和php(它可以正常工作)和靜態打字是我的頭。 有任何想法嗎?

編輯:

這會引發錯誤

[D cannot be cast to [Ljava.lang.Object.

我錯過了什么?

if (o.getClass().isArray()) {
    Object[] objects = (Object[]) o;  
}

如果你不想為所有原始類型進行切換,你可以這樣做:

if (ofArray.isPrimitive()) {
    int length = Array.getLength(o);
    for (int i = 0; i < length; i++) {
        Object obj = Array.get(o, i);
        System.out.println(obj);
    }
}
else {
    Object[] objects = (Object[]) o;
    for (Object obj : objects) {
        System.out.println(obj);
    }
}

編輯:如果您不想在代碼中的兩個不同位置循環,請使用此方法將原始數組轉換為對象數組:

static Object[] convertToObjectArray(Object array) {
    Class ofArray = array.getClass().getComponentType();
    if (ofArray.isPrimitive()) {
        List ar = new ArrayList();
        int length = Array.getLength(array);
        for (int i = 0; i < length; i++) {
            ar.add(Array.get(array, i));
        }
        return ar.toArray();
    }
    else {
        return (Object[]) array;
    }
}

這適用於具有Object元素的元素的數組:

if (clazz.isArray()) {
    Object[] objects = (Object[]) o;
    for (Object obj : objects)
        System.out.println(obj);
}   

如果你需要將數組轉換為特定的數組類型,你可以(ab)使用instanceof但是,例如,只是將內容打印為字符串, Object[]就足夠了。

UPDATE

如果數組是基本類型,你沒有選擇,只能測試每個數組並轉換為正確的類型, Object[]將不適用於這種情況 - 但Java中沒有那么多原始類型,所以它不會是一個巨大的開關:)。 這就是我的意思:

if (clazz.isArray()) {
    if (clazz.getComponentType().equals(double.class)) {
        double[] numbers = (double[]) o;
        for (double d : numbers)
            System.out.println(d);
    }
}  

您不能將一個基元數組類型轉換為Object[]

if (clazz == Array.class) {
  Class ofArray = o.getClass().getComponentType();
  // String arrayType = ofArray.getName(); // 'Double' for my test case
  if (ofArray instanceof double.class)
    double[] doubles = (double[]) o;
  for (double d: doubles)
    System.out.println(d);
}

創建沒有instanceof檢查的Object[]

if (!(o instanceof Object[])) {
  int len = Array.getLength(o);
  Object[] objects = new Object[len];
  for (int i = 0; i < len; i++)
    objects[i] = Array.get (o, i);
  for (Object obj: objects)
    System.out.println(obj);
}

僅知道您的Object是一個數組是不夠的 - 您還應該知道數組元素的基礎類型。 如果你的數組元素是基本類型,比如說double ,你需要

double[] doubleArray = (double[]) o;  

這不起作用:

Object[] objects = (Object[]) o;  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM