Originariamente inviato da Hysoka
PolarPoint [] subsetBorderA = Utilities.arrayRange(bordersA,mA);
ovviamente bordersA è di tipo PolarPoint[].
Ecco il problema: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lmelecon.algorithm.xmath.PolarPoint;

Perché a compilation-time nessuna lamentela, ma a run-time questa?!?! Neanche mettendo un cast esplicito a PolarPoint[] riesco ad arginare il problema.
No, perché il problema è proprio in cosa è stato "reificato" (termine strano che indica cosa è rappresentato a runtime) nell'array.

L'array l'hai istanziato di Object, è "reificato" il tipo Object.

Nella tua riga

PolarPoint [] subsetBorderA = Utilities.arrayRange(bordersA,mA);

Il compilatore sotto-sotto per il valore di ritorno ci infila un cast a PolarPoint[] (perché arrayRange ritorna T[]).

PolarPoint [] subsetBorderA = (PolarPoint[]) Utilities.arrayRange(bordersA,mA);

Ma se l'array è realmente un Object[] .... non può essere un PolarPoint[] e non può essere convertito a questo!!!

Hai presente le collezioni come es. LinkedList che hanno (vedi javadoc) questi due metodi?

Object[] toArray()
<T> T[] toArray(T[] a)

Il primo fa proprio quello che hai fatto tu (istanzia un Object[]) ma lo rende chiaro mettendo come tipo di ritorno Object[]. Un metodo così serve solo quando non ti importa davvero tanto di che tipo è l'array (se è Object[]) ma ti importa solo degli oggetti contenuti.

Se ti interessa il tipo dell'array, con le collezioni devi usare il secondo metodo. Ma questo metodo non istanzia un Object[]! L'unico modo per istanziare un array del giusto tipo è quello di ricevere un array (infatti ha il parametro) e usare la "reflection" di Java per istanziare dinamicamente l'array "copiando" il tipo.

Ti suggerisco di guardare il sorgente di LinkedList per quel secondo toArray. Oltre a trovare la soluzione lo troverai "istruttivo" ...