Весь код Scala переведен на код Java, поэтому я сделал примеры на Java.
Вот как это сделать в Java:
Integer x[] = new Integer[]{1,2,3,4};
final List<Integer> CONST = Collections.unmodifiableList(Arrays.asList(x));
Так что же происходит, спросите вы? CONST находится на расстоянии 1 шага от фактического массива и позволяет скрыть фактический массив и элементы Collection, , где при использовании простого массива это было бы невозможно . Если вы все еще хотите изменить коллекцию констант, вам нужно будет сделать ее копию и изменить ее.
Источник: ссылка
Массив с неизменяемым содержимым?
Java не предоставляет понятие
массив const: массив, который
можно поменять местами на новый массив (в C ++
термины «указатель может быть изменен»),
но чьи элементы не могут быть изменены.
Однако, если вам это нужно
функциональность, решение
как правило, очень похоже на предоставление
доступ только для чтения к любому другому объекту
как обсуждается ниже. Итак, пара
Возможности:
- вы можете создать неизменяемый список, передав список в
Collections.unmodifiableList () (хотя
в этом случае переменная будет
объявлен типа List, а не типа
который пометил его как «неизменяемый» - как
обсуждается ниже, любая попытка изменить
это будет замечено во время выполнения);
- вы можете создать объект-оболочку вокруг частного массива и предоставить
публичные методы читать, но не писать
его элементы;
- Вы можете использовать IntBuffer только для чтения (или FloatBuffer и т. Д.): ...
Источник: Java-эквиваленты - const с точки зрения c ++.
Итак, эквивалент для Scala:
val A = Set(1, 2, 3, 4)
val A = List(1, 2, 3, 4)
Это должно перевести на:
scala.collection.immutable.List[java.lang.Integer] A = List(1, 2, 3, 4)
Это может объяснить мой ответ на комментарий IttayD, почему java 6 отличается от компилятора c ++:
Reified Generics
В настоящее время дженерики реализованы
используя стирание, что означает, что
информация общего типа не
доступны во время выполнения, что делает некоторые
код, который сложно написать. Дженерики
были реализованы таким образом, чтобы поддержать
обратная совместимость со старыми
неуниверсальный код Reified дженерики
сделает общий тип
информация, доступная во время выполнения,
который сломал бы наследие, не являющееся родовым
код. Тем не менее, Нил Gafter имеет
предлагаемые виды изготовления
если указано, чтобы не сломать
обратная совместимость.
Источник: ссылка
Глупо даже упоминать, но в соглашениях об именах констант Java используется заглавная буква для переменной. Другие, читающие ваш код, сразу узнают, что идентификатор является фиксированным постоянным значением, которое нельзя изменить.
Источник: ссылка
... вы не можете просто конвертировать изменяемые коллекции в неизменяемые коллекции, ...
Полезным соглашением, если вы хотите использовать как изменяемые, так и неизменяемые версии коллекций, является импорт только пакета collection.mutable.
import scala.collection.mutable
Источник: API Scala Collection
Не уверен, что вы подразумеваете под конвертированием, но вы, вероятно, можете сделать:
val a = scala.collection.mutable.List[Int](1, 2, 3)
val A = scala.collection.immutable.List[Int](a.toArray())