interface I{}
class A implements I{}
class B{}
pierwsze:Casting "z" Interfejs
I[] arr = new A[10];
arr[0] = (I) new B(); // will produce ClassCastException at runtime
drugie: którym jeśli mogę użyć betonu klasy
I[] arr = new A[10];
arr[0] = (A) new B(); // will produce compile-time error
co za różnica, czy w moim pierwszym przykładzie (I) new B()
, kompilator Javy powinien również spowodować błąd kompilacji?
Czy to nie jest tak, że kompilator java powinien być w stanie odróżnić, że jest to również "typ niezapalny"? Zwłaszcza, gdy nowy operator przychodzi natychmiast?
Czy istnieje jakaś szansa/przypadek, że utworzenie nowej instancji B może spowodować przekształcenie typu I na ?
wiem, w pewnym momencie, że kompilator Javy nie powinien od razu powiedzieć, że jest to błąd kompilatora, jak, kiedy to zrobić:
I i = (I) getContent(); // wherein getContent() will return a type of Object
Edit:
Pozwól mi wyjaśnić pytanie, dlaczego nie jest to możliwe duplikat tego: Cast reference of known type to an interface outside of type's hierarchy
Intencja tego pytania nie jest, ponieważ nie jestem świadomy, co będzie wynikiem lub co jest nie tak z somethi ng, itd.
Chciałbym tylko poznać "bardziej szczegółowe wyjaśnienie w sposób techniczny", dlaczego JVM zachowuje się w ten sposób lub dlaczego Java wymyśliła taką decyzję, aby nie tworzyć tego rodzaju scenariusza Błąd kompilacji.
Jak wszyscy wiemy, zawsze lepiej jest znaleźć "problematyczny kod" podczas kompilacji, a nie podczas pracy.
Inna sprawa, odpowiedź, której szukam, została znaleziona tutaj w tym wątku, a nie w tych "duplikatach?".
Nie sądzę, że jest to ograniczone do tablic. To samo wydaje się być w przypadku 'Ix = (A) new B();' vs. 'I y = (I) new B();' Dla metod ma to sens, ponieważ mogą one zwrócić podklasę typ zwracany, który implementuje interfejs. Ale czy _konstruktor_ może zwrócić podklasę klasy, którą konstruuje? –
16 upvotes już !!! :) .... możemy teraz mieć lepszy tytuł !! ;) – NoobEditor