Недавно я наткнулся на фрагмент кода, который не компилировался в моем Eclipse из-за проблемы с «одинаковым стиранием» (выглядел очень похоже на этот ). Ребята, написавшие код, заверили меня, что он компилируется в их локальной среде и их непрерывная интеграция, поэтому я подыгрывал, чтобы подражать этому.
Взгляните на этот фрагмент:
package com.mycompany.playground;
import java.util.ArrayList;
import java.util.Collection;
public class GenericsTest {
public static void main (String[] args) {
System.out.println(GenericsTest.doSomething(new ArrayList()));
System.out.println(0 == GenericsTest.doSomething(new ArrayList()));
}
public GenericsTest() {
}
public static String doSomething(Collection listOfA) {
return "has done something to Collection";
}
public static Integer doSomething(Collection listOfC) {
return 0;
}
private class A {
}
private class C {
}
}
Eclipse Helios с 1.6. 0_21 JDK в качестве рабочей области по умолчанию не будет компилировать его и будет жаловаться на то, что метод doSomething (Collection) имеет такое же стирание doSomething (Collection), что и другой метод в типе GenericsTest. То же самое можно сказать и о другом методе.
Пытался заставить Eclipse запустить его и увидел: Исключение в потоке "main" java.lang. Ошибка: Неразрешенная проблема компиляции: Метод doSomething (Collection) в типе GenericsTest является неприменимо для аргументов (ArrayList).
Хорошо. Этого следовало ожидать. Сейчас. Если я войду в командную строку и запишу просто:
javac GenericsTest.java
он компилируется. Я проверил 1.6.0_21 и 1.6.0_06 (тот, который у ребят был в своей среде), и никто не жаловался. Я скопировал файлы классов туда, где их ожидал Eclipse, и заставил его запустить его снова.
Он печатает:
has done something to Collection
true
Если я заменю
System.out.println(0 == GenericsTest.doSomething(new ArrayList()));
на
System.out.println(GenericsTest.doSomething(new ArrayList()));
, он все равно будет компилироваться без предупреждений из командной строки, но даст ту же «Неразрешенную проблему компиляции» при попытке его запустить.
Здесь два вопроса.
Неужели javac просто перехитрил встроенный компилятор Eclipse? Выглядит почти так же, как этот ранее заданный вопрос , поэтому я думаю, что знаю ответ. (кстати, как я могу сказать Eclipse использовать вместо него javac ?).
Почему javac молча компилирует то, что java затем не запускается (второй сценарий с удаленной подсказкой {0 ==}?