Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2010, 19:05   #1
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию динамическое приведение типов в java

в С++ есть функция dynamic_cast, позволяющая приводить объекты базового класса к классу-наследнику. Как можно выполнять такие действия в java? Нужно покастить List<Object> к ArrayList<Integer>.
sashonk вне форума Ответить с цитированием
Старый 26.08.2010, 20:20   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Дженерики кастовать нельзя, разве что к подклассам.
т.е. List<Integer> можно кастануть к List<Number>, но не наоборот.
как вариант можно выдернуть все элементы, кастануть явно(через "()" ) и потом запихнуть в новый список.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 26.08.2010, 23:52   #3
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
Хорошо

хорошо. А если мы имеем базовый класс, класс наследник, в котором определена некая специфичная для него функция, и некоторый интерфейс, принимающий параметром ссылку на объект базового класса. И мы хотим передавать в этот интерфейс объект класса-наследника и вызывать там эту специфичную функцию.

Код:
class A{}
class B extends A{
public void foo(){}
}
class C
{
   void other_foo(A base)
   {
      //а здесь делаем какое-то приведение, чтобы вызвать foo()
      ...
   }
}
public void main(...)
{
   B b = new B();
   C c = new C();
   c.other_foo(b);
}
Выходит, этого сделать нельзя? В С++ это довольно мощный инструмент
sashonk вне форума Ответить с цитированием
Старый 27.08.2010, 09:37   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

sashonk так можно. Эта сигнатура
Код:
void other_foo(A base)
говорит: я хочу что бы всё, что является наследником от класса A могло приниматься мной(методом). Дальше сработает механизм RTTI и вызовутся нужные методы нужного объекта, в данном примере объекта b.
Так правильнее будет:
Цитата:

class A{
public void foo(){
System.out.println("A->foo()");
}
}

class B extends A{
public void foo(){
System.out.println("B->foo()");
}
}

class C
{
void other_foo(A base){
base.foo();
}
}

public class Prog {

public static void main(String[] args) {
B b = new B();
C c = new C();
c.other_foo(b);
}
}

Результат: B->foo()

Последний раз редактировалось profi; 27.08.2010 в 09:49.
profi вне форума Ответить с цитированием
Старый 27.08.2010, 10:33   #5
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

вы привели типичный пример вызова виртуальной функции класса. Я же говорил о вызове метода, специфичного для класса наследника. В моем примере foo() в базовом классе отсутствует
sashonk вне форума Ответить с цитированием
Старый 27.08.2010, 10:37   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Только так можно:
Код:
class C
{
void other_foo(B base){
base.foo();
}
}
profi вне форума Ответить с цитированием
Старый 27.08.2010, 12:03   #7
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Я это уже понял. Спасибо
sashonk вне форума Ответить с цитированием
Старый 27.08.2010, 20:05   #8
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Только так можно
нет, не только.

Код:
class C
{
void other_foo(A base){
((B)base).foo();
}
}
Говоря о невозможности кастовать дженерики я имел ввиду дженерики, а не все остальное.

да и еще, надо делать проверку на возможность кастования:
Код:
if(base instanceof B){
   ((B)base).foo();
}
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 27.08.2010 в 20:08.
alexinspir вне форума Ответить с цитированием
Старый 27.08.2010, 22:54   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

alexinspir не вижу большой разницы. Та и вообще ТС не советовал бы интересоваться кодом такого типа .

Последний раз редактировалось profi; 27.08.2010 в 23:00.
profi вне форума Ответить с цитированием
Старый 28.08.2010, 19:52   #10
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
alexinspir не вижу большой разницы. Та и вообще ТС не советовал бы интересоваться кодом такого типа .
Если вы студент, без опыта работы по специальности, не встречавшийся с реальной разработкой, то это не значит что все ваши утверждения чисты и невинны.

операции типа
Код:
if(base instanceof B){
   ((B)base).foo();
}
используются очень часто. и к индусскому коду вообще не относятся.

хотите пример?
swing:
component.getParent() - возвращает Container. при том не ясно что это - Panel или Window и тд и тп.
для выяснения использют instanceof, и для доступа к специфичным функциям кастуют к необходимому типу.

з.ы. profi ознакомьтесь с рефлексией, наверняка откроете много нового для себя
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведение типов в Qt mike_tihomirov Qt и кроссплатформенное программирование С/С++ 1 19.06.2010 13:14
Приведение типов... В чем отличия? Gtx541 Общие вопросы C/C++ 1 16.06.2010 19:54
Приведение типов для SQL-запроса Rio309 БД в Delphi 1 06.06.2010 13:39
Cтроки. Приведение типов. char * to float Aerial Общие вопросы C/C++ 3 28.04.2010 14:54
Приведение типов массива объектов Arnezami Общие вопросы .NET 3 17.12.2009 11:30