- public class Inheritance {
- private static class A {
- public void tt() {
- }
- }
- private static class B extends A {
- public void tt() {
- }
- }
- public static void main(String... args) {
- A a = new A();
- a.tt();
- B b = (B) a;
- b.tt();
- }
- }
Она скомпилируется, но при запуске кинет эксепшн:
a
Exception in thread "main" java.lang.ClassCastException: Inheritance$A cannot be cast to Inheritance$B
at Inheritance.main(Inheritance.java:18)
Все верно... для Java.
Однако, в GWT можно так делать. Причем, даже нужно, потому что других способов создать иерархию объектов из JavaScriptObject невозможно, ведь инстанцирование их напрямую запрещено, что исключает использование фабрик. К примеру:
- import com.google.gwt.core.client.JavaScriptObject;
- import com.google.gwt.core.client.JsArray;
- import com.google.gwt.user.client.Window;
- public class Test {
- private static class A extends JavaScriptObject {
- protected A() {
- }
- public final void amethod() {
- Window.alert("A");
- }
- public final native boolean isB() /*-{
- return this.is_b;
- }-*/;
- }
- private static class B extends A {
- protected B() {
- }
- public final void bmethod() {
- Window.alert("B");
- }
- }
- public void test() {
- JsArray<A> objects = getObjects();
- for (int i = 0; i < objects.length(); i++) {
- A a = objects.get(i);
- if (a.isB()) {
- ((B) a).bmethod();
- } else {
- a.amethod();
- }
- }
- }
- private static final native JsArray<A> getObjects() /*-{
- return [{is_b: false}, {is_b: true}];
- }-*/;
- }
Это можно объяснить тем, что скомпилированный код - уже не Java, а Javascript. Конечно, нельзя использовать наследование по полной - перегружать методы например, т.к. они или класс должны быть "final", но это позволяет разнести логику наследуемых сущностей по классам, сделать код более читаемым и проще поддерживаемым.