2011-03-18 5 views
10

"유형 차이 주석"(+-)은 "유형 멤버"에 적용 할 수 없습니다.유형 구성원 및 공분산

class StringBox extends Box { type T = String; override val element = ""}

그래서 Box이라고 말할 수 있습니다 자신에게 그것을 설명하기 위해 나는Box 연장 내가 에있는 클래스 StringBox를 만들려면 지금 다음 example

abstract class Box {type T; val element: T}

을 고려 자연히 공역 형 T. 다시 말해, 유형 구성원이있는 클래스는 해당 유형에서 공 변합니다.

의미가 있습니까?
형식 멤버와 형식 분산 간의 관계를 어떻게 설명 할 수 있습니까?

+0

당신은 폴을 허용 대답을 변경시겠습니까? 내 것이 적당하지 않습니다. –

+0

@ DanielC.Sobral 완료. 감사 – Michael

답변

14

상자는 유형 T에서 불변이지만 표시 할 것이 없습니다.

abstract class Box { 
    type T 
    def get: T 
} 
type InvariantBox = Box { type T = AnyRef } 
type SortofCovariantBox = Box { type T <: AnyRef } 

분산 상황을 변경하는 것은 유형이 노출되는 정도와 수행 방식입니다. 추상 유형은 더 불투명합니다. 그러나 당신은 repl에서 이러한 이슈들을 가지고 놀아야합니다. 그것은 매우 재미 있습니다.

# get a nightly build, and you need -Ydependent-method-types 
% scala29 -Ydependent-method-types 

abstract class Box { 
    type T 
    def get: T 
} 
type InvariantBox = Box { type T = AnyRef } 
type SortofCovariantBox = Box { type T <: AnyRef } 

// what type is inferred for f? why? 
def f(x1: SortofCovariantBox, x2: InvariantBox) = List(x1, x2) 

// how about this? 
def g[U](x1: Box { type T <: U}, x2: Box { type T >: U}) = List(x1.get, x2.get) 

등은