Посилання Java завжди вказують на об'єкт. Об'єкт має заголовок, який серед іншого ідентифікує конкретний тип (тому касти можуть не мати успіху ClassCastException
). Для масивів початок об'єкта також включає довжину, дані потім випливають відразу в пам'ять (технічно реалізація вільна робити те, що заманеться, але було б сміливо робити все інше). Отже, ви не можете мати t посилання, яке вказує десь на масив.
У вказівниках C вказуйте будь-де і на що завгодно, і ви можете вказувати на середину масиву. Але ви не можете безпечно відкинути або дізнатись, який довгий масив. У D покажчик містить зміщення в блоці пам'яті та довжині (або рівнозначно вказівник до кінця, я не можу пригадати, що реально робить реалізація). Це дозволяє D нарізати масиви. У C ++ у вас є два ітератори, що вказують на початок і кінець, але C ++ трохи дивним чином.
Тож повертаючись до Java, не можна. Як вже було сказано, NIO ByteBuffer
дозволяє обернути масив, а потім розрізати його, але дає незручний інтерфейс. Ви, звичайно, можете скопіювати, що, ймовірно, набагато швидше, ніж ви могли подумати. Ви можете ввести власну String
абстракцію, яка дозволяє нарізати масив (поточна реалізація НД String
має char[]
посилання плюс стартове зміщення та довжина, більш висока продуктивність виконання просто має char[]
). byte[]
низький рівень, але будь-яка абстракція на основі класу, яку ви наділите, призведе до жахливого безладу синтаксису, поки JDK7 (можливо).