,我讀了我的書,這樣的代碼:的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;'這行應該出錯。 –