Se stai ricevendo un'eccezione di runtime, significa che gli oggetti che hai provato a trasmettere non hanno questo tipo. La lingua non ha niente a che fare con questo. Probabilmente c'è un bug nel tuo codice.
Modifica: Sembra che tu sia confuso dal funzionamento del sistema di tipi di Java. In C#, i generici rappresentano in realtà diversi tipi in fase di esecuzione. In Java, i tipi generici non esistono in fase di runtime. Sono solo una comodità per consentire una migliore verifica del tipo di tempo di compilazione. Durante la compilazione, i generici vengono sostituiti da un tipo reale in un processo noto come cancellazione dei tipi.
Normalmente, la cancellazione di un tipo generico è Object
, ma poiché è stato fornito un limite superiore per T
, viene convertito in tale limite, Comparable
. Pertanto, dopo la cancellazione, il tuo codice appare come questo.
Comparable[] aux = (Comparable[]) new Object[xs.length];
In altre, si sta creando una matrice di tipo Object[]
e subito cercando di lanciare per digitare Comparable[]
. Poiché Object
non implementa Comparable
, i tipi non sono compatibili, pertanto si ottiene un'eccezione di runtime. Puoi risolvere questo problema creando invece una serie di Comparable
s.
public static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
T[] aux = (T[]) new Comparable[xs.length];
mergeSort(xs, aux, 0, xs.length);
}
Penso che si dovrebbe vedere http://stackoverflow.com/questions/1817524/generic-arrays-in-java è abbastanza interessante. –