2015-10-28 21 views
6

Ho definito la seguente classe generica, ma quando la uso sull'oggetto classe non viene compilata. Il costruttore non avrebbe accettato un altro oggettoDiamante Non compilato Java 7

class Pair<T,V> { 

    T one; 
    V two; 


    public Pair(T one, V two) { 
     this.one = one; 
     this.two = two; 
    } 


} 
public static void main(String[] args) { 

    String hamza = "Hamza"; 
    Integer soufiane = 0; 

    Pair<Object,Object> pairOne = new Pair<>(hamza, soufiane); 
    Pair<Object,Object> pairTwo = new Pair<Object, Object>(soufiane, hamza); 

} 

Messaggio di errore:

incompatible types: Pair<String,Integer> cannot be converted to Pair<Object,Object> 

Perché il primo non compilare e la seconda di compilazione?

EDIT: E ' compilato su Java 8

+0

È piuttosto raro che qualcosa non si compili e il compilatore non ti dica _why_ che non viene compilato. – Tom

+1

ho incluso il messaggio di errore lì! È la notazione del diamante e dovrebbe essere compilata, almeno per quanto ne so. Perché mi ha costretto a includere i parametri del modello è ciò che non capisco. –

+3

Bene, i tipi generici non sono polimorfi, quindi assegnare 'Coppia ' a 'Coppia ' non funziona e Java 7 pensa che dovrebbe essere 'Coppia ' perché tu ha detto che gli argomenti passati diranno il tipo. Java 8 d'altra parte è un po 'meglio con "trovare" il tipo generico corretto. – Tom

risposta

3

Il codice non riuscire perché il compilatore Java 7 non riesce a trovare il tipo derivato corretta; d'altra parte java 8 si compilerebbe e funzionerebbe bene. (Tl; dr: java 7 non funziona correttamente con tutti i diamanti, questo è stato migliorato in java 8)

JEP 101: Generalized Target-Type Inference

Uniformemente ampliare il campo di applicazione del metodo di tipo inferenza a sostegno (i) inferenza nel contesto del metodo e (ii) inferenza in chiamate concatenate.

Significato java 8 sarebbe in grado di determinare il tipo di chiamata utilizzando l'operatore diamante.

MODIFICA: Sembra che qualcuno mi abbia battuto a questa risposta nello thread e l'abbia spiegato più chiaramente di me; quindi dai un'occhiata!