2013-11-25 57 views
-1

鑄字爲什麼在這一行工作在Android的類型轉換在android系統的TextView

TextView tv = (TextView) findViewById(R.id.someId); 

但在我的情況下,它會導致錯誤

public class B extends A{ 
    void b(){ 
    System.out.println("from B class"); 
      }} 
public class A { 
    public static void main(String[] args) { 
     B b =(B) new A(); 
     b.b(); 
}} 

,如果我不糊塗

findViewById(R.id.someId); 

這個字符串應該返回視圖對象,視圖是一個超文本視圖。所以我不明白爲什麼它在android中工作。請幫助我理解,對於任何迴應將非常感激。

回答

0

findViewById方法的簽名是返回View但返回的實際對象不是View但是從View繼承的類之一,例如TextView。該對象已經是TextView,因此鑄件可以正常工作。

這是因爲如果你有一個方法:

public A someMethod() { 
    return new B(); 
} 

,並用它

B b = (B) someMethod(); 
+1

非常感謝您的快速響應。現在我明白了。 – Brucine

3
TextView tv = (TextView) findViewById(R.id.someId); 

這上面投只有當通過R.id.someId標識的觀點,其實是無效的TextView (或延伸至TextView-and there are quite a few的任何其他視圖)。如果它是,例如,ImageView,你會得到ClassCastException

返回到您的代碼段:

public class B extends A { ... } 

上述定義的B每個實例也是A一個實例。然而,相反的情況並非如此(以及常見的錯誤):A的每個實例不一定是B的實例。這將更加清晰,只要你添加一個擴展A另一個類變成:B類型的

public class C extends A { ... } 

對象和CA實例,但A可以爲ABC。並且B的實例可以是從不C的實例。因此,以下是無效的:

B b = (B) new A(); 

你正在創建的A一個新的實例,但A不是B一個實例。正如我們上面所建立的那樣,反之亦然。因此類型轉換無效。實際上,由於您正在創建新的A,因此它始終只是A的一個實例,沒有什麼比這更簡單了。