,我读了我的书,这样的代码:的Java:通用类
class B extends A {...}
class G<E> {
public E e;
}
G<B> gb = new G<B>();
G<A> ga = gb;
ga.e = new A();
B b = gb.e; // Error
为什么B b = gb.e;
出现错误?我们没有分配任何东西给b,因为那个gb.e来自类型B.
,我读了我的书,这样的代码:的Java:通用类
class B extends A {...}
class G<E> {
public E e;
}
G<B> gb = new G<B>();
G<A> ga = gb;
ga.e = new A();
B b = gb.e; // Error
为什么B b = gb.e;
出现错误?我们没有分配任何东西给b,因为那个gb.e来自类型B.
与您确切的设置,我从在该行,你试图创建第二个参照对象G的实例的编译器(的Sun Java编译器1.6.x版)获得一个错误:
G.java:6: incompatible types
found : G<B>
required: G<A>
G<A> ga = gb;
^
1 error
试图交换哪里发生转换也将失败:
代码:
G<A> ga = new G<A>();
G<B> gb = ga;
gb.e = new A();
B b = gb.e;
错误:
G.java:6: inconvertible types
found : G<A>
required: G<B>
G<B> gb = (G<B>)ga;
^
G.java:7: incompatible types
found : A
required: B
gb.e = new A();
^
2 errors
你是积极的,这是不是与前面的行问题?这件事我没有运气。
即使情况是你设法做到了这一点,但这应该仍然失败,因为当试图获得新的B引用时不知道正确的类型。既然你只能向上转换(所以,A instance = new B()
应该是OK,B instance = new A()
不会),那么采用A的实例并将其沿层次结构向下移动到B的类型是没有意义的。
你试图将一个类转换到它的一个子类而不是其他方式。
A a;
B b;
a = new B(); // works because B is a subclass of A
b = new A(); // fails because A is a superclass of B
但为什么gb来自A型?是行:'ga.e = new A();'为gb和ga定义它们来自A类? – Tom
你确定错误只出现在行B b = gb.e;'?而不是在'G ga = gb;'? –
@Vineet Reynolds:没有,因为B Tom
恐怕,这根本就不是[至少对我而言](http://www.ideone的.com/6gREv)。随意发布代码可以在同一行中重现相同的错误。在我看来,和Eclipse编译器javac和ideone一样,由于使用了严格的打字检查,'G ga = gb;'这行应该出错。 –