2016-12-01 1 views
2

В настоящее время я изучаю Scala и читаю эту книгу Программирование в Scala и в котором говорится: «В отличие от массива или списка кортеж может содержать объекты разных типов». Например, следующий кортеж содержит Int, String и Float.Разница между Tuple и List [Any] в Scala?

val tup = (1, "hello", 4.4) 

Опять же, говорит, что книга, «Если вы хотите иметь любой тип элемента в списке/массиве, то вы можете использовать любой тип:».

val list = List[Any](1, "hello", 4.4) 

Итак, в чем разница между этими двумя подходами? в чем преимущество одного над другим?

+1

Тип 'Any' является хорошим признаком того, что что-то пошло не так. Избегай это. – jwvh

ответ

2

Any является типа данных, так же, как Int или String, но отличается от них.
Tuple является контейнером, который может содержать несколько типов данных, то есть он может содержать Vals различных типов данных, но тип Tuple будет зависеть от того, сколько элементов есть в Tuple, так, например:

val tup = (1, "hello", 4.4) // type of tup here is scala.Tuple3 (Int, String, Double) 
val tup = (2.3, null) // type of tup here is scala.Tuple2 (Double, Null) 
val tup = (5:Any, "hello", 2.2) // type of tup here is scala.Tuple3 (Any, String, Double) 

Но тип каждого из элементов в Tuple будет поддерживаться. Any, как родной тип данных, в котором нет уникального типа элементов, будь то String или Int или Null тип первоначально, будет преобразован в один тип данных Any и потеряет весь тип -Информация.

Обновление:
Разница между Tuple и List[Any] является то, что Tuple может содержать элементы нескольких типов данных, сохраняя при этом типе данных отдельных элементов.
Хотя List или Array может содержать только элементы одного типа данных , поэтому List[Any] будет состоять из всех элементов типа Any, поэтому она будет в основном преобразовать все элементы (независимо от их ранее типа данных) в Any.

+0

Сравнение между кортежем и 'List [Any]' (или 'Array [Any]' или 'Seq [Any]'), а не между кортежем и 'Any' :) –

+0

@AlexeyRomanov, извините, мой плохой. Хотя мой ответ может объяснить эту разницу, я отредактирую ее. Спасибо за указание :) – Yankee

6

tup имеет типа (Int, String, Double), так что вы можете получить данные обратно с правильным типом: tup._1 имеет тип Int. list имеет тип List[Any], поэтому вы потеряли всю информацию о типе: list(0) - тип Any.

Не используйте Any (или List[Any] и т. Д.), Если только вам не нужно; конечно, не используйте его, когда кортеж будет делать.

+0

Спасибо за точный ответ. Таким образом, использование List [Any] означает, что вся информация о типе будет потеряна. Я избегу использовать Any как можно меньше. Спасибо. –

3

Кортежи безопасны по типу и со списком [Любые] вам необходимо наложить элемент на соответствующий тип.

val tup = (1, "hello", 4.4) 
tup._2 --> gives you string 

val list = List[Any](1, "hello", 4.4) 
list(1) --> gives you object of type Any and you have to cast this object 

Ваш кортеж представляет собой класс типа Tuple3 [Int, String, Double].

+0

Итак, List [Any] не является безопасным по типу, и при использовании будут накладные расходы на литье. Спасибо за ваше объяснение. –

+0

Честно говоря, в большинстве случаев не только накладные расходы на литье, но и код, сгенерированный компилятором для кортежей (и для большинства применений дженериков). Тип безопасности - единственная реальная проблема, но она очень большая. –

0

Я не согласен с PawelN

val list = List[Any](1, "hello", 4.4) 
for (i <- list) println(i.getClass) 

или

val array = Array[Any](1, "hello", 4.4) 
for (i <- array) println(i.getClass) 

результаты:

class java.lang.Integer 
class java.lang.String 
class java.lang.Double 

Следовательно, никакой отливки не требуется, когда доступ к элементу в списке или Массив Людей. Конечно, я бы с подозрением относился к разработке кода, который использует такую ​​вещь.

Главный пункт кортежа состоит в том, чтобы функция могла возвращать произвольное количество объектов разных типов. Это гораздо более легкий вес, чем создание класса каждый раз, когда вам нужно возвращать несколько значений за счет безопасности определенного типа.

 Смежные вопросы

  • Нет связанных вопросов^_^