Автор Тема: Вопрос по сертификации  (Прочитано 1512 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн windwail

  • Коллежский регистратор
  • *
  • Сообщений: 1
  • Репутация: 0
Вопрос по сертификации
« : °ТУгбв 06, 2009, 02:16:19 pm »
Никак не возьму в толк, почему в двух строчках идет ошибка КОМПИЛЯЦИИ, а в других компилятор молчит...


import java.io.Serializable;


class B extends A{}
final class C extends B {}
class B2 extends A {}
class C2 extends B2 {}

class A {
public static void main (String[] args) {

A a = new B();
B b = new B();
C c = new C();

C[] ca = null;
a = b;
b = c;
A a1 = (B)c;
Runnable r1 = (Runnable) a;
Runnable[] ra1 = null;
A r2 = (A)r1;
A[] aa1 = (A[])r1; // compile error
A[] aa2 = (A[])ra1;
ra1=(Runnable[])ca; // compile error


}
}

Как мне известно, компилятор может ругаться только тогда, когда видит что идет попытка преобразовать объекты из разных веток наследования... A[] и Runnable[] это ведь разные ветки наследования, они оба расширяют Object[], посему по логике вещей не могут преобразовываться друг к другу. Это доказывает и следующий эксперимент

class A {}
class B extends A{}
class B2 extends A {}

public class TestTest {
public static void main(String[] args) {


B b = null;
B2 b2 = (B2) b; // compile error

B[] ba = null;
B2[] b2a = (B2[])ba; // compile error
}
}

может я уже туплю... рассудите плиз
« Последнее редактирование: °ТУгбв 06, 2009, 02:24:01 pm от windwail »

Оффлайн S48GS

  • Коллежский регистратор
  • *
  • Сообщений: 18
  • Репутация: 1
Re: Вопрос по сертификации
« Ответ #1 : БХЭвпСам 21, 2009, 10:10:18 am »
В коде ошибка.
Runnable r1 = (Runnable) a;
Именно
Цитировать
идет попытка преобразовать объекты из разных веток наследования
И эта ошибка
A[] aa1 = (A[])r1; // compile error
Следствие.(помимо того,что неясно как хотите преобразование сделать из Object в Object[])

А вторая:
ra1=(Runnable[])ca; // compile error
Исправляется
ra1=(Runnable[])(A[])ca; // no compile error

и также во втором коде:
....
B2 b2 = (B2)(A) b; // no compile error
....
B2[] b2a = (B2[])(A[])ba; // no compile error
...