Эволюция языка Java была медленной, но сознательно так.
Дженерики обеспечивает хороший пример. Совместимость с предыдущими версиями Java была требованием. , Учитывая цели проекта , реализация дженериков выполняет очень полезную функцию точно, как разработано. Однако это не оправдывает надежды многих разработчиков, которые ожидали поведение овеществленных дженериков.
Инновации в JVM, с другой стороны, были чрезвычайно быстры, часто следуя впереди для другого VMs, и способствуя конкуренции на арене производительности.
, По-моему, язык Java должен быть максимально стабильным. Мне нравится идея закрытий, но я не полагаю, что Java является языком для них. (Если бы что-то должно войти, я предпочел бы консервативный FCM.) Я работаю с командой разработчиков, которым нужно обучение, чтобы создать и поддержать сложное производственное приложение. Язык Java дает нам хорошее смешение питания и структуры как есть
, Другие языки, как Scala и Groovy и порты к JVM как Ruby и Python, продолжат давать жизнь платформе Java, даже после того, как сам язык Java пошел путем КОБОЛа.
java.util.Collections.shuffle(java.util.Arrays.asList(a:_*))
Для правильной работы вышеуказанного Тип элемента a должен быть подклассом scala.AnyRef (эквивалент java.lang.Object), потому что Arrays.asList () использует переданный массив в качестве резервного хранилища для результата java.util.List и java.util.List может содержать только ссылки на объекты (не примитивные значения). *
Это также причина, по которой Collections.shuffle (), который перемешивает переданный java.util.List, фактически перемешивает массив. *
*: См. примечание ниже
Например:
scala> val a = Array[java.lang.Integer](1, 2, 3) // note the type parameter
a: Array[java.lang.Integer] = Array(1, 2, 3)
scala> java.util.Collections.shuffle(java.util.Arrays.asList(a:_*))
scala> a
res43: Array[java.lang.Integer] = Array(1, 3, 2)
scala> java.util.Collections.shuffle(java.util.Arrays.asList(a:_*))
scala> a
res45: Array[java.lang.Integer] = Array(1, 2, 3)
Примечание: Scala 2.7.5 используется для приведенных выше фрагментов кода. Scala 2.8.0 демонстрирует другое поведение, как продемонстрировал Дэниел. На всякий случай, не зависят от того, что массив перетасовывается, а вместо этого перетасовывается список, возвращаемый из Arrays.asList ().
scala> val a = Array[java.lang.Integer](1, 2, 3)
a: Array[java.lang.Integer] = Array(1, 2, 3)
scala> val b = java.util.Arrays.asList(a:_*)
b: java.util.List[java.lang.Integer] = [1, 2, 3]
scala> java.util.Collections.shuffle(b)
scala> b
res50: java.util.List[java.lang.Integer] = [2, 1, 3]
scala> java.util.Collections.shuffle(b)
scala> b
res52: java.util.List[java.lang.Integer] = [3, 1, 2]
Кажется, Scala делает что-то отличное от Java, когда дело касается varargs. По крайней мере, я никак не могу перетасовать этот массив. Предположительно, перемешивание в списке приведет к перемешиванию массива, потому что список поддерживается массивом. Что ж, похоже, что Scala создаст массив new при передаче аргументов vararg в Java, что сделает вышеупомянутый пример бесполезным.
scala> val b = java.util.Arrays.asList(a: _*)
b: java.util.List[java.lang.String] = [a, b, c]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [a, b, c]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [c, b, a]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [a, c, b]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [b, a, c]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [a, b, c]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [c, a, b]
Он действительно работает с Ints, хотя и утверждается иначе:
scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)
scala> val b = java.util.Arrays.asList(a: _*)
b: java.util.List[Int] = [1, 2, 3]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [2, 3, 1]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [3, 2, 1]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [3, 2, 1]
scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [1, 2, 3]
В Scala 2.8 есть более простой способ:
scala> scala.util.Random.shuffle(a)
res32: Sequence[Int] = Array(1, 2, 3)
scala> scala.util.Random.shuffle(a)
res33: Sequence[Int] = Array(2, 1, 3)
scala> scala.util.Random.shuffle(a)
res34: Sequence[Int] = Array(3, 2, 1)
Обратите внимание, что в стиле Scala он не изменяет исходный массив.
Чтобы ответить на вопрос "что именно здесь происходит?" part:
Когда вы говорите java.util.Arrays.asList (a), вы вызываете статический метод Java, который определен для приема переменного числа аргументов (синтаксис vararg ... в Java):
public static <T> List<T> asList(T... a)
В Scala, когда вы вызываете asList, вы передаете один Array [String], а не три строковых параметра. Несмотря на то, что Scala представляет T * как Array [T], вам нужно сообщить компилятору, что вы действительно хотите передать три параметра, а не один параметр, который является списком из трех вещей.
В Scala есть удобный способ преобразовать ваш Array [String] в String, String, String: вы используете символ _ *, как показано в ответе Уолтера Чанга. Вы можете использовать его всякий раз, когда передаете что-нибудь в функцию vararg.