У меня есть логгер, который принимает на вход объект, и мне это очень удобно. Но теперь мне нужно зарегистрировать ввод типа int[]. Я хочу изменить метод, чтобы он правильно регистрировал любой массив или Iterable.

В C # я бы сделал следующее:

int[]data=new int[10];
object tmp=data;

.....

if (tmp is IEnumerable)
{
     StringBuilder _tmp = new StringBuilder();
     foreach (var i in (IEnumerable)tmp)
     {
         if (_tmp.Length > 0)
         {
             _tmp.Append(",");
         }
         _tmp.Append(i);
     }
     var r = _tmp.ToString(); 
 }

Я пробовал проверять int[] на Iterable (это не так), затем я пробовал проверять с помощью tmp.getClass().isArray(), который работает, но теперь у меня проблемы с перечислением членов этого массива. Мне нужен метод, который будет работать с любым массивом или списком объектов.

Как мне правильно это сделать на Java?

2
Arsen Zahray 11 Ноя 2014 в 20:43
1
Попробуйте tmp.getClass().getComponentType()
 – 
damian
11 Ноя 2014 в 20:47
Почему вы отбрасываете информацию о типе?
 – 
Elliott Frisch
11 Ноя 2014 в 20:47
Метод регистратора выглядит как Log(Object... arguments), и я нахожу его очень удобным в использовании
 – 
Arsen Zahray
11 Ноя 2014 в 20:50

2 ответа

Лучший ответ

Вы можете использовать методы в java.lang.reflect.Array нравится

Object obj = new int[] { 1, 2, 3, 4 };
try {
    int len = Array.getLength(obj);
    for (int i = 0; i < len; i++) {
        if (i != 0) {
            System.out.print(", ");
        }
        System.out.print(Array.get(obj, i));
    }
    System.out.println();
} catch (IllegalArgumentException iae) {
    iae.printStackTrace();
}

Выход

1, 2, 3, 4

2
Elliott Frisch 11 Ноя 2014 в 20:54

Вероятно, нет чистого способа сделать это в Java (*). Думаю, это сработает:

Object tmp = ...;

String s;
if (tmp instanceof boolean[]) {
    s = Arrays.toString((boolean[]) tmp);
}
else if (tmp instanceof byte[]) {
    s = Arrays.toString((byte[]) tmp);
}
else ...

И сделайте то же самое для char[], double[], float[], int[], long[], short[]; если isArray() равно true и это не один из вышеперечисленных случаев,

s = Arrays.toString((Object[]) tmp);

ИЗМЕНИТЬ: Я проверил это, и он работает.

См. этот javadoc для получения списка доступных Arrays.toString методы.

(*) Хорошо, использование Array.get, как в другом ответе, вероятно, более чистый подход. Я это тестировал, и он тоже работает.

0
ajb 11 Ноя 2014 в 20:56