2013-02-02 4 views
0

스칼라 목록의 모든 객체가 동일한 유형이어야한다는 인상을 받았고 다른 유형의 무언가가 필요한 경우 튜플을 사용해야합니다. 유형의 요소의 스칼라의 documentation, List는 불변의 연결리스트에 대한스칼라 목록의 객체 유형

클래스는 주문을 나타내는, 컬렉션에서

.

scala> val l1 = List(1,2,3) 
l1: List[Int] = List(1, 2, 3) 

scala> val l1 = List(1,2,3, "oh really?!") 
l1: List[Any] = List(1, 2, 3, oh really?!) 

이 경우 될 것 같지 않습니다. 결국 Any은 유효한 Scala 유형이며 모든 것을이 유형으로 줄일 수 있습니다.

명시 적 목록의 유형을 지정하지 않은

+0

에서 더 자세한 설명을 찾을 수 있습니다.'List [T]'에는 'T'와 호환되는 유형의 값이있을 수 있습니다. 'List (1, 2, 3, "string")'와 같은'List' 리터럴을 쓸 때 컴파일러는 인수에있는 모든 값의 유형을 포함하는 상위 유형을 찾습니다. 'AnyVal' (원시 타입)과'AnyRef' (클래스 타입)에서 타입을 혼합 할 때 유일한 공통 타입은'Any'입니다. 이것은 두 번째 예제에서 일어난 것입니다. –

답변

10

명확히하고 당신은 객체의 두 가지 유형에 넣어, '모든'형식의 목록을 만드는 것이 편리 할 것이고, 그렇지 않습니다하세요 규칙을 깨라. val l1: List[Int] = List(1,2,3, "oh really?!")이라고 말하면 다른 경우 (형식 불일치가 있음을 알 수 있습니다)

항상 둘 중 하나만 해결되는 것은 아닙니다. Vehicle이라는 클래스와 Bike와 Car라는 클래스를 상속받은 클래스가 있다고 가정 해 보겠습니다.

val car = new Car 
val bike = new Bike 
val vehicleList = List(car, bike) 

vehicleList는 이제 Vehicle 유형이됩니다. 자동차 나 자전거를 거기에 넣었다면 특정 유형이었을 것입니다.

선택적 배경 정보 : 스칼라의 목록은 공변이며, Int와 String이 모두의 하위 유형이면 List [Int]와 List [String]도 List [Any]의 부속 유형입니다. 즉, 정수 및 문자열이 포함 된 목록을 가질 수 있으며 이는 명령문이 유효하고 자동으로 List [Any]가되는 이유입니다. 이것은 항상 주어진 사실이 아니며 실제로 목록이 변경 될 수있는 경우 실제로 문제가 될 수 있습니다. 운좋게도 스칼라의 기본 목록은 그렇지 않습니다. 더 자세히 알고 싶으면 Covariance, Invariance and Contravariance explained in plain English?

+0

나는 "Any"의 상한선을 '편리하다'라고 추론하지 않을 것이다. 그것은 보통 당신이 뭔가 잘못하고 있다는 것을 의미합니다. 그래서 스칼라에 경고가 있습니다. – eriksensei

+0

어쩌면 그렇듯이 그의 질문이 표현 된 방식으로 그는 목록에 전혀 다른 유형이있을 것이라고 기대하지 않았 음을 지적했다. 이는 내가 '편리함'으로 언급 한 것인데, 예를 들면 Vehicles . –