2017-02-13 56 views
3

我想了解java編譯器如何工作有關類型鑄造,但我無法弄清楚。兩個大概不相關的類之間的Java鑄造

,請參見下面的代碼

public class SampleTester{ 
    public static interface A1{} 
    public static class A2{} 
    public static class A3 extends A2 implements A1{ 
     public static void main(String[] args){ 
      List<A1> test = new ArrayList<>(); 
      test.add(new A3()); 
      A2 a2 = (A2) test.get(0); 
     } 
    } 
} 

這段代碼編譯,但如果我改變

A2 a2 = (A2) test.get(0); 

A2 a2 = (Integer) test.get(0); 

它提供了編譯錯誤。

類型不匹配:因爲我看到它不能從整數轉換到SampleTester.A2

,A2是不相關的A1以任何方式(完全按整數是沒有關係的),因此如何投來的作品?

回答

6

首先,您的問題的標題不正確 - 您不是在兩個類之間進行投射 - 您正在將類型爲接口類型的表達式轉換爲類類型。

test.get(0)A1類型的接口。儘管A2沒有實現該接口,但某些A2的子類可能會實現該接口(並且實際上您已定義了這樣的類 - A3),因此該轉換可以成功。因此編譯器允許它。

Integer不能被分類(這是最後一類),所以不會有Integer的子類實現A1。由於轉換不能成功,編譯器不允許它。

+1

很好的答案,謝謝。在你回答之後,我意識到,即使在採用「擴展A2」之後,它也會編譯,意思是(如果我錯了,就糾正我),編譯器不需要看到真正的層次結構連接,只是潛在的一個。 – DsCpp

+0

@DsCpp這是正確的。 – Eran