Creazione di una classe Vector (fisica) in Java

0

Sto provando a creare una classe vettoriale (come in fisica) in Java. Voglio supportare l'aggiunta di vettori, i prodotti a punti, la moltiplicazione scalare, ecc. Quindi, la mia domanda è, è possibile farlo con i generici? Generics può prendere solo oggetti come parametri ma mi piacerebbe usare le primitive (double o float).

    
posta Daniel 30.04.2016 - 13:22
fonte

2 risposte

3

Non funzionerà con double o float perché come hai notato non puoi creare un generico per i tipi primitivi. Ma funzionerà con i tipi di box Double e Float . A causa di autoboxing questo non farà molta differenza nella pratica.

Ciò significa che puoi creare un generico che può essere utilizzato con qualsiasi cosa che estende Number con public class PhysicsVector<T extends Number> .

Sfortunatamente non puoi fare aritmetica su Number . Ciò significa che tutti i tuoi metodi dovranno convertire i valori nella loro rappresentazione in virgola mobile chiamando .doubleValue() su di essi.

    
risposta data 30.04.2016 - 13:34
fonte
1

@ La risposta di Philipp è giusta per la tua domanda diretta, ma facciamo un passo indietro per rivedere le ipotesi.

Primo presupposto: stai utilizzando Java 8 o versioni precedenti. (Una versione futura supporterà Generics over Primitive Types .)

In secondo luogo, perché usare i farmaci generici qui? Potenzialmente è possibile risparmiare spazio se si dispone di un numero molto elevato di vettori in memoria, ma il boxing richiederà più spazio per vettore rispetto al salvataggio utilizzando float anziché double . Un oggetto vettoriale 3D con valori di 3 Double o Float richiederà 4 nodi heap e conseguenti errori di localizzazione indiretta e cache della CPU.

Generics aggiungerà complessità oltre a spazio e tempo. Il codice generato eseguirà tutti i calcoli con valori di double in modo che non salverà il tempo di calcolo della CPU, in quanto ciò comporterà un ulteriore risparmio di tempo matematico per convertire% valori difloat in double .

L'overhead dello spazio si riduce se si memorizzano tutti i valori in double[] o float[] poiché si tratta di una singola casella per tutti i valori, ma c'è ancora un nodo heap aggiuntivo per istanza e ora ci sono controlli dei limiti della matrice su ogni numero recupera e memorizza.

Se vuoi davvero risparmiare spazio con un numero molto grande di vettori in memoria, il modo per farlo in Java 8 è di avere una classe astratta Vector con un'API che usa valori double e FloatVector e DoubleVector sottoclassi che contengono direttamente 3 valori primitivi.

Di nuovo, se non ne hai molti in memoria, vai per una semplice classe Vector che contiene double (o float ) valori.

    
risposta data 30.04.2016 - 17:49
fonte

Leggi altre domande sui tag