Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознать array и преобразовать к исходному типу, Динамически выбрать тип преобразования 
V
    Опции темы
_Y_
Дата 29.11.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Метод получает параметр 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 - нет.

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



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
powerOn
Дата 29.11.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



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

Код

        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));
            }
        }





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
w1nd
Дата 29.11.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Код
  public void method(Object object) {
      if (object.getClass().isArray()) {
          Class arrayElementType = object.getClass().getComponentType();
          
          ...
      }
  }


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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
powerOn
Дата 29.11.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



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


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

Код

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



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
w1nd
Дата 29.11.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



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

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


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
nornad
Дата 30.11.2007, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



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

Пример:
Код

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)



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
_Y_
Дата 30.11.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
powerOn
Дата 30.11.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



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

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

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




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
_Y_
Дата 1.12.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(powerOn @ 30.11.2007,  21:07)
на языке Java не записать

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
powerOn
Дата 1.12.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



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

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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
_Y_
Дата 1.12.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



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

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.