2010-07-30 109 views
3

我在我的日食中有這個程序。如果我使用JDK 1.5(構建路徑 - >配置構建路徑 - > java compilern - > JDK compliance - > compiler compliance level = 1.5)進行編譯,我得到方法m1的類型擦除錯誤方法有相同類型的擦除

我有一個選項在構建路徑 - >配置構建路徑 - > java編譯 - > JDK符合性 - >編譯器符合級別= 5)中選擇編譯器合規性級別爲5時,我不會收到此錯誤。

我看不出在此設置我選擇任何區別。但是,爲什麼我會得到這個錯誤?什麼區別1.5-5

import java.util.*; 
class TestWrapper 
{ 
public static void main(String[] args) { 
      List<Number> ls1 = new ArrayList<Number>(); 
      List<String> ls2 = new ArrayList<String>(); 
      m1(ls1,ls2); 
     } 
     public static void m1(List<Integer> l1,List<Integer> l2){}    
     public static void m1(List<Number> l1,List<String> l2) {} 

感謝所有的答案 的Java :)

+0

您正在使用什麼版本的Eclipse,我無法找到煤礦符合級別5的任意位置的選項;他們都是1.x.合規性水平1.5和5應該是同樣的事情,因爲他們將命名方案從1.5改爲5(然後移動到6,相當於1.6)。 – 2010-07-30 09:21:17

+0

我使用的版本爲「Version:Helios Release Build id:20100617-1415」,我在這裏得到了一個錯誤。這是我昨天從eclipse網站下載的最新版本。我明白你的意思,你沒有下拉5。即使我在這個版本的eclipse中看不到5。但我的同事用「版本:3.3.0版本ID:I20070625-1500」,他們沒有得到一個錯誤,在下降的值爲5倒 – Java 2010-07-30 09:43:13

+0

請問這個鏈接幫助https://bugs.eclipse.org/bugs/ show_bug.cgi?id = 320514 – Java 2010-07-30 09:56:43

回答

3

Java的泛型使用的是被稱爲「類型擦除」的方法來實現。基本上,編譯器插入一些隱藏的強制轉換,並從泛型類的名稱中刪除該類型。所以一旦代碼被編譯,List<Integer>就變成List。與List<Number>List<String>相同。這意味着你最終會得到兩個public static void m1(List, List)方法。

這是不應該在任何 Java編譯器工作;爲什麼它會被允許對我來說有點神祕。

+0

感謝您的回答。我不知道它設置了什麼JDK,或者事實上我不知道如何找到它?我認爲當我選擇5作爲我的合規性級別時,我認爲它是JDK 1.5或JRE 5.我在某處錯了嗎?我正在建立一個環境,我的同事們把它定爲5.我想要把這個兼容級別設置爲1.5。 eclipse構建路徑 - >編譯器中的這個編譯級別是什麼?我很困惑!!! – Java 2010-07-30 09:27:59

+1

方法重載選擇是在編譯時完成的,所以在運行時會發生什麼並不重要。 – 2010-07-30 12:21:55

+2

類型擦除也是在編譯時完成的 - 類型擦除會給你兩個相同的方法。這不會在任何有效的Java編譯器中飛行。 – cHao 2010-07-30 19:19:56

0

IMO你應該在任何情況下錯誤。你可以查閱一下JDK配置對符合級別「5」

+0

我不知道它設置了什麼JDK,或者事實上我不知道如何找到它?我認爲當我選擇5作爲我的合規性級別時,我認爲它是JDK 1.5或JRE 5.我在某處錯了嗎?我正在建立一個環境,我的同事們把它定爲5.我想要把這個兼容級別設置爲1.5。 eclipse構建路徑 - >編譯器中的這個編譯級別是什麼?我很困惑!!! – Java 2010-07-30 09:43:33

相關問題