2016-01-08 61 views
0

爲什麼編譯器不停止寫入這樣的代碼並拋出運行時錯誤。爲什麼通用類型參數的類允許在類內拋出

public class GenericTest<T,S> { 
    T x; 
    S y; 

    public GenericTest(T x,S y) { 
     this.x=x; 
     this.y=y; 
    } 
    void display(){ 
     System.out.println("Display->"+((int)x)+y); //why does it throw error runtime instead of compile time? 
    } 
} 

當調用這個會明顯失敗。

public class Test { 

    public static void main(String[] args) { 
     GenericTest<String, String> s=new GenericTest<String, String>("Hello","World"); 
     s.display(); 

    } 
} 

爲什麼它允許泛型類型強制類型轉換:

System.out.println("Display->"+((int)x)+y); 
+0

當'GenericTest'被編譯,如何將編譯器知道你會使用不能被蒙上了一層類? –

+1

如果你通過Integer ...這個程序將會工作,這將是由於自動裝箱。所以編譯器有一個有效的用例,不會拋出編譯時錯誤 – awsome

+0

我知道它的工作與整數。但是爲什麼Java允許在類本身中轉換爲類定義的泛型,因爲它的定義表明這將允許使用任何類型構造? – iMBMT

回答

3

因爲

GenericTest<Integer, Integer> s = new GenericTest<Integer, Integer>(new Integer(1), new Integer(2)); 
s.display(); 

是一個有效的代碼,它會產生一個輸出。

另外TS是unbouded仿製藥,它們相當於ObjectObject可以投到Integer

Object o = ...; 
Integer i = (Integer) o; 

此外,自Java 7以來,object can be cast to int。因此沒有編譯錯誤。

您的代碼就相當於

class GenericTest { 
     Object x; 
     Object y; 

     public GenericTest(Object x,Object y) { 
      this.x=x; 
      this.y=y; 
     } 
     void display(){ 
      System.out.println("Display->"+((int)x)+y); 
     } 
} 
相關問題