Beh il mio dubbio è questo:Sta ereditando da una matrice primitiva impossibile dalla prospettiva della JVM?
In Java, è annullato a ereditare da una matrice, vale a dire, non si può fare cose come:
class FloatVec extends float[]
{
// Vector methods.
}
FloatVec somevec = new FloatVec()[] { 1, 2, 3 }; // With array initializer.
O ancora meglio:
class FloatVec3 extends float[3]
{
// Regular accessor.
public float getX() {
return this[0];
}
// Or say, make it the 'this' implicit like with other fields:
public void setVec(float x, float y, float z) {
[0] = x;
[1] = y;
[2] = z;
}
// And specific vec3 methods like:
public float dotProduct() {
float x = this[0];
float y = this[1];
float z = this[2];
return x * x + y * y + z * z;
}
}
Ma gli array implementano effettivamente un'interfaccia specifica e sono considerati oggetti. cioè, ci si aspetta che le istanze dell'array siano gli stessi metodi esposti da Object, più un campo array specifico, il campo 'lunghezza' finale.
Quindi la mia domanda sono, anche se il linguaggio Java non consente questo utilizzo:
Potrebbe essere implementato nella JVM senza troppi cambiamenti?
La JVM tratta gli array come qualsiasi oggetto con una classe da cui si può ereditare?
La JVM tratta gli array come enumerazioni, ovvero rendendo gli oggetti array ereditari automaticamente da una classe di array definita?
La classe dell'array è definita da qualche parte in modo da poter essere ereditata?
Considerando che altri linguaggi possono essere implementati sulla JVM, e che tutto ciò che serve in questo caso è una sorta di "cancellazione del tipo" (quando si desidera passare questi array alle API che si aspettano array "regolari") e al boxing (quando ricevi risultati), non riesco a capire perché non si possa fare ... Dal punto di vista del compilatore, ovviamente, questo è molto più complicato ... (disclaimer: I'm not a Java guy) –
Ecco cosa ha ottenuto io penso. Supponi che la VM faccia supposizioni sul layout degli array in memoria poiché sono corretti. Ad esempio, il campo "lunghezza" è a 12 byte sfalsati nell'oggetto, i dati iniziano con 16 byte sfalsati, terminano con "lunghezza" * byte per elemento dopo quello. Le normali operazioni dell'array potrebbero funzionare su questi presupposti. Se non fa ipotesi su cosa si trova oltre i dati dell'array, puoi aggiungere tutti i campi della tua classe ereditata e chiamarla un giorno. Quindi, di nuovo, la risoluzione della posizione di questi campi aggiuntivi * potrebbe * differire da come vengono risolti i normali campi oggetto. – TheStack