2010-07-30 2 views
3

У меня есть эта программа в моем затмении. И если я скомпилирую это с помощью JDK 1.5 (путь сборки -> configure build path -> java compilern -> соответствие JDK -> уровень соответствия компилятора = 1.5), я получаю ошибку стирания типа для метода m1Методы имеют стирание того же типа

У меня есть опция выбор уровня соответствия компилятора как 5 в driop down (путь сборки -> configure build path -> java compilern -> соответствие JDK -> уровень соответствия компилятора = 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

Какую версию затмения вы используете, я не смог найти вариант для уровня соответствия 5 в моей; они все 1.x. И уровень соответствия 1.5 и 5 должен быть одним и тем же, поскольку они изменили схему именования - от 1,5 до 5 (а затем переместились до 6, что эквивалентно 1,6). –

+0

Я использую версию «Версия: Helios Release Build id: 20100617-1415», где я получаю сообщение об ошибке для этого сценария. Это последняя версия, которую я загрузил вчера с сайта eclipse. Я вижу, что вы говорите, что вы не получаете 5 в выпадающем списке. Даже я не вижу 5 в этой версии затмения. Но мои коллеги используют «Версия: 3.3.0 Build id: I20070625-1500», где они не получают ошибку и имеют значение 5 в раскрывающемся списке – Java

+0

Будет ли эта ссылка помогать https://bugs.eclipse.org/bugs/ show_bug.cgi? id = 320514 – Java

ответ

3

дженериков Java-реализованы с использованием метода, называемого «типа стирания». В основном, компилятор вставляет некоторые скрытые приведения и удаляет тип из имени универсального класса. Поэтому, как только код скомпилирован, List<Integer> станет List. То же самое с List<Number> и List<String>. Это означает, что вы получите два метода public static void m1(List, List).

Это не должно работать в any Java-компилятор; почему это разрешено, для меня это немного загадка.

+0

Спасибо за ваши ответы. Я не знаю, на какой JDK он установлен или на самом деле я не знаю, как его найти? Я думал, что когда я выбираю 5 в качестве уровня соответствия, я думал, что это JDK 1.5 или JRE 5. Я где-то ошибаюсь? Я создаю среду, и мои коллеги здесь имеют ее как 5. Я хотел бы установить уровень компиляции как 1.5. Что это за уровень компиляции в eclipse build path-> компилятор? Я запутался!!! – Java

+1

Метод перегрузки выбора выполняется во время компиляции, поэтому то, что происходит во время выполнения, не имеет значения. –

+2

Тип стирания также выполняется во время компиляции - и стирание типа даст вам два одинаковых метода. Это не собирается летать в любом рабочем компиляторе Java. – cHao

0

IMO Вы должны получить ошибку в любом случае. Вы можете проверить, какой JDK настроен на уровне соответствия «5»

+0

Я не знаю, на какой JDK он установлен или на самом деле я не знаю, как его найти? Я думал, что когда я выбираю 5 в качестве уровня соответствия, я думал, что это JDK 1.5 или JRE 5. Я где-то ошибаюсь? Я создаю среду, и мои коллеги здесь имеют ее как 5. Я хотел бы установить уровень компиляции как 1.5. Что это за уровень компиляции в eclipse build path-> компилятор? Я запутался!!! – Java

Смежные вопросы