Considerate questo codice Java:
package test;
public class Genric<E>
{
public Genric(E c){
System.out.println(c.getClass().getName());
}
public static void main(String[] args) {
new Genric<Integer[]>(new Integer[]{1,2});
}
}
Per il primo caso:
List< ? extends Integer[] > l;
Quando fai qualcosa di simile List< ? extends Integer[] > l;
poi il compilatore Java vede come un List< ? extends Object> l;
e lo traduce di conseguenza . Quindi questo è il motivo per cui non si ottiene alcun errore.
Il byte-codice generato è il seguente:
.
.
.
20: aastore
21: invokespecial #52; //Method "<init>":(Ljava/lang/Object;)V
24: return
.
.
partenza il numero di riga . Sebbene, ho passato una serie di java.lang.Integer
; internamente è tradotto in java.lang.Object
.
Per il secondo caso:
class MyClass< T extends Integer[] > { } // ERROR!
Come da Java specifica del linguaggio:
TypeParameter:
TypeVariable TypeBoundopt
TypeBound:
extends ClassOrInterfaceType AdditionalBoundListopt
.
.
Come si può vedere il il limite è costituito esclusivamente di classe o un'interfaccia (nemmeno tipi primitivi). Quindi quando fai qualcosa di simile a questo class MyClass< T extends Integer[] > { }
allora Integer[]
non si qualifica come una classe o interfaccia.
Come per la mia comprensione di Java Spec, questo è stato fatto per risolvere tutti gli scenari come
class MyClass< T extends Integer[] >
class MyClass< T extends Integer[][] >
- ..
class MyClass< T extends Integer[][]...[] >
Poiché tutti loro possono essere rappresentati come java.lang.Object
e quando passati come parametro, come nell'esempio
public Genric(E c){
System.out.println(c.getClass().getName());
}
come 'c' ricorda il suo vero tipo.
Spero che questo possa essere d'aiuto.
È strano. Il JLS afferma chiaramente che è possibile utilizzare solo le classi o le interfacce in variabili di tipo, ma non fornisce alcuna spiegazione di sorta. – biziclop
solo per fare come-confronti: "Elenco Estende Intero []> k1;" è permesso, ma "List k2;" non è. Ma non ho trovato nulla tranne null da aggiungere alla lista! Eclipse dice che k1.get (0) restituisce il tipo Integer [], ma non è stato possibile aggiungerne uno. –