2017-02-15 18 views
0

所以我就在這裏驗證碼:想知道爲什麼下面的兩個例子給出了一個運行時錯誤和編譯錯誤之所以出現這種代碼有一個運行時錯誤VS編譯錯誤

public abstract class Person<Mate> { 
    public String name; 
    public abstract Person<?> mate(Mate m); 

    public static class Male extends Person<Person<?>.Female> { 
    public Person<?> mate(Person<?>.Female m) { 
     return null; 
    } 
    } 

    public class Female extends Person<Male> { 
    public Person<?> mate(Male m) { 
     return null; 
    } 
    } 
} 

誰能告訴我爲什麼這個代碼的例子給出了運行時錯誤

Person p = new Male(); 
p.mate(p); 

而這一個給出了一個編譯錯誤

Person p<Female> = new Male(); 
p.mate(p); // Argument is of incorrect type. 
+0

請將**完整**編譯錯誤消息/運行時錯誤消息+堆棧跟蹤添加到您的問題中。 –

回答

1

這是因爲:

Person p = new Male(); 

是使用Raw Types的一個例子。

使用任何原始類型都會導致JVM執行非常奇怪的事情。不要使用它們。

+0

另外使用原始類型會產生原型警告。注意警告。 –