Методы имеют стирание одного типа - PullRequest
3 голосов
/ 30 июля 2010

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

У меня есть возможность выбрать уровень соответствия компилятора равным 5 в спуске (путь сборки -> настроить путь сборки -> 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:)

Ответы [ 2 ]

3 голосов
/ 30 июля 2010

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

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

0 голосов
/ 30 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...