2009-10-22 3 views
7

Continuo a ricevere questo errore quando si compila utilizzando Maven:codice sorgente stesso, Eclipse costruire il successo, ma Maven (javac) non riesce

type parameters of <X>X cannot be determined; no unique maximal instance exists for type variable X with upper bounds int,java.lang.Object 

Generics tipo interferenze non può essere applicato a tipi primitivi. Ma ho pensato che, dal momento che Java5, il meccanismo di boxing/unboxing funziona perfettamente tra i tipi primitivi e le classi wrapper.

In ogni caso, la cosa strana è che Eclipse non segnala errori e compila felicemente. Sto usando JDK1.6.0_12. Quale potrebbe essere il problema qui?

risposta

3

Un paio di cose da guardare:

  1. Sia Eclipse e Maven stanno usando la stessa installazione di Java/bin
  2. Eclipse e Maven stanno usando le stesse librerie, si potrebbe avere qualcosa l'altro no.
+2

Ho appena realizzato che il compilatore fornito con Eclipse non è lo stesso del compilatore Java ufficiale di Sun. – EnToutCas

11

Questo problema può verificarsi quando il codice è generico e chiama un altro metodo con un tipo di ritorno generico. A volte il compilatore viene confuso cercando di capire come risolvere il metodo call/return type.

Può essere risolto aggiungendo un cast esplicito al codice.

// Old code: 
public T getValue() { 
    return otherMethod(); // otherMethod has the signature: <RT> RT otherMethod() { ... } 
} 

// New code: 
@SuppressWarnings("unchecked") 
public T getValue() { 
    return (T) otherMethod(); // the cast tells the compiler what to do. 
} 
0

Ho incontrato lo stesso errore, utilizzare ant. Perché quando compili da ant o da maven, javac usa JDK per compilare. Ma in Eclipse, ha JDT, che può compilare con successo.

Aggiungo lo script seguente nel file build.xml: <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" /> Quindi, la formica può creare successo.

Non ho familiarità con Maven. Forse, può impostare il compilatore?

Nel mio codice sorgente, ci sono molti codice come questo: public <X> X find(String hql, Object... values) { return (X) HibernateUtils.createQuery(getSession(), hql, values).uniqueResult(); }

Forse il vostro codice di troppo.

Ma, usare JDT, il successo non è il successo finale, nella formica. build.xml può creare successo solo in eclissi. quando eseguo il comando ant da windows, fallire. Fai un altro errore: Class not found: org.eclipse.jdt.core.JDTCompilerAdapter

PS, ho dei file jar di copia su JDT nel plugin eclipse nella directory ant_home/lib.

Vorrei un piccolo aiuto a voi. E il nostro problema può risolvere.

0

Deve assolutamente fare qualcosa con le versioni di JDK utilizzate da Maven ed Eclipse. Assicurati inoltre che il livello di conformità del compilatore in Eclipse punti alla versione JDK corretta.