Ну мои сомнения это одна:Наследуется от примитивного массива, невозможного с точки зрения JVM?
В Java, это запрещено наследовать из массива, то есть, один не может делать такие вещи, как:
class FloatVec extends float[]
{
// Vector methods.
}
FloatVec somevec = new FloatVec()[] { 1, 2, 3 }; // With array initializer.
Или еще лучше:
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;
}
}
Но массивы фактически реализуют определенный интерфейс и считаются объектами. т.е. ожидается, что экземпляры массива будут одинаковыми методами, открытыми объектом, плюс поле определенного массива, поле конечной длины.
Так что мой вопрос есть, даже если язык Java не позволяет это использование:
Может быть реализованы в JVM, не слишком много изменений?
Подходит ли JVM к массивам, как к любому объекту с классом, который может быть унаследован?
Поддерживает ли JVM массивы, такие как перечисления, т. Е. Делает объекты массива наследуемыми автоматически из определенного класса массива?
Определен ли класс массива где-то таким образом, чтобы его можно было унаследовать?
Учитывая, что другие языки могут быть реализованы поверх JVM, и что все, что вам нужно в этом случае, это своего рода «стирание типа» (когда вы хотите передать эти массивы API-интерфейсам, ожидающим «регулярные» массивы) и бокс (когда вы получаете результаты), я не понимаю, почему это не может быть сделано ... С точки зрения компилятора, конечно, это намного сложнее ... (отказ от ответственности: я не парень Java) –
Вот что получилось я думаю. Скажем, что VM делает предположения о макете макетов в памяти, так как они исправлены. Например, поле «длина» имеет смещение по 12 байт в объект, данные начинаются с 16-байтового смещения, заканчивается на «длину» * байтов на элемент после этого. Эти допущения могут работать с регулярными массивами. Если он не делает предположений о том, что лежит за пределами данных массива, после этого вы можете добавить все поля своего унаследованного класса и называть его днем. Опять же, устранение местоположения этих дополнительных полей * может * отличаться от того, как разрешены обычные поля объекта. – TheStack