странное поведение при ошибке компиляции «одинаковое стирание»

Недавно я наткнулся на фрагмент кода, который не компилировался в моем 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()));

, он все равно будет компилироваться без предупреждений из командной строки, но даст ту же «Неразрешенную проблему компиляции» при попытке его запустить.

Здесь два вопроса.

7
задан Community 23 May 2017 в 12:14
поделиться