Если вы получаете исключение во время выполнения, это означает, что объекты, которые вы пытались использовать, не имеют такого типа. Язык не имеет к этому никакого отношения. Вероятно, в вашем коде есть ошибка.
Редактировать: Похоже, вы смущены тем, как работает система типов Java. В C# дженерики фактически представляют разные типы во время выполнения. В Java общие типы не существуют во время выполнения. Они являются лишь удобством, позволяющим лучше проверять тип времени компиляции. Во время компиляции дженерики заменяются реальным типом в процессе, известном как стирание типа.
Обычно стирание родового типа Object
, но поскольку вы указали верхнюю границу для T
, она преобразуется в эту границу, Comparable
. Поэтому после стирания ваш код выглядит следующим образом.
Comparable[] aux = (Comparable[]) new Object[xs.length];
В других случаях, вы создаете массив типа Object[]
и немедленно пытается бросить его типа Comparable[]
. Поскольку Object
не реализует Comparable
, типы несовместимы, поэтому вы получаете исключение во время выполнения. Вы можете исправить это, создав вместо этого массив из 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);
}
Я думаю, вы должны увидеть http://stackoverflow.com/questions/1817524/generic-arrays-in-java это довольно интересно. –