Recentemente sono incappato in un pezzo di codice che non sarebbe stato compilato in Eclipse a causa della "stessa cancellazione" (sembrava molto simile a this one). I ragazzi che hanno scritto il codice mi hanno assicurato che compila nel loro ambiente locale e la loro continua integrazione e così ho giocato insieme per emularlo.comportamento strano attorno all'errore di compilazione "same erasure"
Date un'occhiata a questo frammento:
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<A>()));
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
}
public GenericsTest() {
}
public static String doSomething(Collection<A> listOfA) {
return "has done something to Collection<A>";
}
public static Integer doSomething(Collection<C> listOfC) {
return 0;
}
private class A {
}
private class C {
}
}
Eclipse Helios con 1.6.0_21 JDK come spazio di lavoro di default non sarebbe compilarlo e si lamentava che il metodo doSomething (Collection) ha la stessa cancellazione doSomething (Collection) come un altro metodo nel tipo GenericsTest. Direbbe lo stesso per l'altro metodo.
Tentativo di forzare Eclipse per eseguirlo e visto: Eccezione nel thread "main" java.lang.Error: problema di compilazione non risolto: il metodo doSomething (Collection) nel tipo GenericsTest non è applicabile per gli argomenti (ArrayList).
Ok. Era prevedibile. Adesso. Se vado nella mia riga di comando ed eseguo semplice:
javac GenericsTest.java
compila. Ho controllato 1.6.0_21 e 1.6.0_06 (quello che i ragazzi avevano nel loro ambiente) e nessuno dei due si è lamentato. Ho copiato i file di classe su dove Eclipse li aspettava e l'ho obbligato a eseguirlo di nuovo.
Esso stampa:
has done something to Collection<A>
true
Se si sostituisce la
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
con
System.out.println(GenericsTest.doSomething(new ArrayList<C>()));
sarebbe ancora compilare senza avvertimenti da riga di comando, ma dare lo stesso "compilation non risolti problema "durante il tentativo di eseguirlo.
Due domande qui.
javac ha semplicemente superato in astuzia il compilatore Eclipse incorporato? Sembra quasi esattamente come this previously asked question quindi credo di conoscere la risposta. (a proposito, come posso dire ad Eclipse di usare javac?).
Perché sarebbe javac silenziosamente compilare quello che java poi non riuscire a correre (secondo scenario con {0} == "suggerimento" rimosso?
Il compilatore di Eclipse è corretto, Sun 'javac' è errato. Lo dice la specifica del linguaggio Java. In particolare, [Sezione 8.1.2 Classi generiche e Parametri del tipo] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.2) copre cosa sia un tipo generico e [ 8.4.2 Firma del metodo] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2) illustra quali firme causeranno errori in fase di compilazione. – Powerlord