Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Распознать array и преобразовать к исходному типу


Автор: _Y_ 29.11.2007, 15:36
Метод получает параметр Object надо распознать является ли этот обьект массивом, и преобразовать его к исходному типу. Что-то вроде:
Код

//Метод
public void method(Object o){
    if(ЯВЛЯЕТСЯ_МАССИВОМ(o)) {
        classId = ПОЛУЧИТь_КЛАСС(o);
        classId v = (classId)o;
        for(int i = 0; i < v.length; i++) {
            СДЕЛАТь_ЧТО-НИБУДь_ПОЛЕЗНОЕ(v[i]);
        }
    }
}
//Вызов 1
String[] strArr = {"aa","bb"};
method(strArr);
//Вызов 2
method(strArr[0]);
//Вызов 3
int[[] intArr = {5,10,15};
method(intArr);

Понятно, что вызовы 1 и 3 должны привести ка каким-то действиям (разным), а вызов 2 - нет.

Никак не соображу - как к тзкому подойти, но есть ощущение, что это возможно.

Автор: powerOn 29.11.2007, 15:56
Насчет преобразования пока мало мыслей, но по поводу всего остального, то можно так:

Код

        Object o = new int [] {1,2,3,4};
      
        if (o.getClass().isArray())
        {
            for(int i = 0; i < Array.getLength(o); i++)
            {
                System.out.println(Array.get(o, i));
            }
        }



Автор: w1nd 29.11.2007, 16:48
Код
  public void method(Object object) {
      if (object.getClass().isArray()) {
          Class arrayElementType = object.getClass().getComponentType();
          
          ...
      }
  }


Преобразовать и того проще - просто откастить к Object[].

Автор: powerOn 29.11.2007, 17:29
Цитата(w1nd @  29.11.2007,  16:48 Найти цитируемый пост)
Преобразовать и того проще - просто откастить к Object[]. 


Массив объектов примитивных типов к Object[] не откастить. Такой код не пройдет:

Код

        Object o = new int [] {1,2,3,4};
        Object [] arr = (Object[]) o;

Автор: w1nd 29.11.2007, 17:47
Цитата(powerOn @  29.11.2007,  17:29 Найти цитируемый пост)
Массив объектов примитивных типов к Object[] не откастить.

Да, примитивные типы я не учёл smile

Автор: nornad 30.11.2007, 05:23
Ну, как я понял, преобразование в псевдокоде было указано с целью последующего использования массива, т.е. получения элемента массива. В этом случае каст всего массива вряд ли требуется - получить элемент по индексу можно.
Правда, примитивные типы будут при касте обёрнуты, но это не обязательно плохо.

Пример:
Код

public class TestUndefArray
{
    public static void main( String[] args ) {
        Object o = new int[] { 1, 2, 3, 4 };
        String[] strArr = { "aa", "bb" };
        TestUndefArray.method(o);
        TestUndefArray.method("sdgf");
        TestUndefArray.method(strArr);
    }

    public static void method(Object o) {
        if ( o.getClass().isArray() ) {
            for ( int i = 0; i < Array.getLength(o); i++ ) {
                System.out.println(Array.get(o, i) + " (" + Array.get(o, i).getClass().toString() + ")");
            }
        } else {
            System.out.println(o.getClass().toString() + " is not a array");
        }
    }
}

Вывод в консоль:
Код

1 (class java.lang.Integer)
2 (class java.lang.Integer)
3 (class java.lang.Integer)
4 (class java.lang.Integer)
class java.lang.String is not a array
aa (class java.lang.String)
bb (class java.lang.String)

Автор: _Y_ 30.11.2007, 11:57
Спасибо. В рамках моих проблем этого вполне достаточно. Хотя все равно хотелось бы откастить результат к исходному типу (из чисто академического интереса) smile 

Автор: powerOn 30.11.2007, 21:07
это не возможно, ибо конструкции типа:
Код

classId = ПОЛУЧИТь_КЛАСС(o);
classId v = (classId) o;

на языке Java не записать. Т.е. нельзя в рантайме определить ссылку на объект. 


Автор: _Y_ 1.12.2007, 13:03
Цитата(powerOn @ 30.11.2007,  21:07)
на языке Java не записать

Хорошо. Пойдем длинным путем. А через оператор if нельзя ли? В смысле в его разных ветках создавать разные типы объектов в зависимости от того, что за объект поступил на вход?

Автор: powerOn 1.12.2007, 13:23
Цитата(_Y_ @  1.12.2007,  13:03 Найти цитируемый пост)
А через оператор if нельзя ли? В смысле в его разных ветках создавать разные типы объектов в зависимости от того, что за объект поступил на вход? 

можно (instanceof тебе поможет), если число типов строго ограничено и не очень большое (20-30 if это уже некрасиво). 

Автор: _Y_ 1.12.2007, 14:29
Цитата(powerOn @ 1.12.2007,  13:23)
можно (instanceof тебе поможет), если число типов строго ограничено

мда. С этого у меня все и начиналось. Абыдна, да!?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)