Ty może wiesz co jest w tablicy, a może się pomylisz. Kompilator wie natomiast na pewno tylko to co napisałeś i nie może nic nadinterpretować. Gdyby Java pozwalała na rzutowanie referencji między zupełnie dowolnymi obiektami, to całą kontrolę typów można by wyrzucić do kosza. A Java zamieniłaby się w C++.
Tablica elementów A nie ma nic wspólnego z tablicą elementów B (bez względu na to czy A i B mają coś wspólnego ze sobą). Nie można więc rzutować referencji tablic między sobą. Można jedynie zrzutować tablicę na pojedynczy Object (nietablicowy) i z powrotem (chyba) bo tablica jest obiektem klasy dziedziczącej bezpośrednio po Object.
Nie możesz mylić rzutowania referencji elementów do rzutowania referencji tablicy.
W Twoim kodzie możesz rzutować z powrotem na LDAPModification ponieważ w obiektach, które obrabiasz jest zapisana informacja o tej klasie. A obiekty możesz rzutować tylko na klasy pomiędzy klasą faktycznie utworzonego potomka, a pierwszym rodzicem (czyli Object). Jeżeli dziedziczą po sobie A => B => C, to jeżeli utworzysz C możesz rzutować go na Object, A i B (Object jest rodzicem każdej klasy). Ale jeżeli utworzysz B, to możesz taki obiekt rzutować tylko na Object i A. Nie będziesz mógł nigdy zrzutować takiego obiektu na C. W obu wypadkach nie możesz zrzutować na D, który jest z zupełnie innej bajki.
Popatrz na taki kod:
import java.util.ArrayList;
import java.util.List;
public class NewClass
{
public static void main(String[] args)
{
List<Integer> modifyList = new ArrayList<Integer>(10);
for(int i = 0; i < 10; i++)
modifyList.add(i);
System.out.print("Lista: ");
for(Integer liczba:modifyList)
System.out.print(liczba + ", ");
System.out.println();
Thread.yield();
try { Thread.sleep(2000); } catch(InterruptedException ex) {}
Object jakaśCholera = modifyList.toArray();
Double[] lm = new Double[((Object[])jakaśCholera).length];
for (int i = 0; i < ((Object[])jakaśCholera).length; i++)
{
Object[] obj = ((Object[])jakaśCholera);
lm[i] = (Double) obj[i]; //error runtime z powodu typu elementu
}
System.out.print("Tablica: ");
for(Double liczba :lm)
System.out.print(liczba + ", ");
}
/*
Lista:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
Exception in thread "main" java.lang.ClassCastException:
java.lang.Integer cannot be cast to java.lang.Double
at SFCmodel.NewClass.main(NewClass.java:24)
Java Result: 1
*/
}
Java bez problemu go kompiluje. Ale błąd wyrzuca dopiero w czasie wykonania i wysypuje się dopiero na
rzutowaniu łamiącym hierarchię klas bo Double oraz Integer są potomkami Object, ale między sobą nie mają nic wspólnego