Понятие «того же типа» всегда зависит от уровня общности. В Scala уровень общности определяется формальным типом.
Есть 3 и 7 "одного типа"? Если мы пишем ...
val a : Int = 3
val b : Int = 7
тогда они из одного и того же типа Int
. Но, если мы определим немного длины ограничено Int
типов (которые мы очень рады сделать в Scala), мы могли бы написать
val a : Int2 = 3
val b : Int3 = 7
, и они больше не появляются, чтобы быть того же типа!
Если определить иерархию наследования
trait Animal;
class Dog extends Animal;
class Frog extends Animal;
затем сделать Dog
и Frog
имеют одинаковый тип? Если мы напишем
val d : Dog = new Dog
val f : Frog = new Frog
тогда, похоже, ответ отрицательный. Но если мы напишем
val d : Animal = new Dog
val f : Animal = new Frog
тогда они выглядят так, как будто они имеют одинаковый тип. В соответствии с этим, если я объявляю массив как
val arr : Array[Dog] = Array.ofDim[Dog](5)
то я не могу поставить лягушку в нем, потому что лягушка не собака. Но если я объявляю аналогичный массив
val arr : Array[Animal] = Array.ofDim[Animal](5)
Тогда, конечно, как лягушки и собаки могут идти в этом, потому что на уровне общности Animal
, как лягушки и собаки имеют одинаковый тип.
В Scala Any
- базовый тип, из которого производятся все другие типы. Таким образом, на очень высоком уровне общности, 5
, "hello"
и 1.5
, все они имеют один и тот же тип Any
, так же, как на высоком уровне общности Frog
и Dog
имеют одинаковый тип Animal
. Поэтому нет проблем с размещением 5
, "hello"
и 1.5
в Array[Any]
.
Я думаю, что правильный ответ для этого слишком широк. Пожалуйста, проконсультируйтесь с одним из многих учебных пособий Scala. –
. Ваш вопрос предполагает, что вы понимаете, что значение имеет только один уникальный тип. Но это не так - на языке с подтипированием значение может быть одновременно членом многих типов. –