2016-09-23 4 views
3

왜 다음 작업을 수행 할 수 있습니다 (이 컴파일 이유는?) :앨리어싱 올바른 유형

class A 
type M[_] = A 

나는 기대 내가 할 수있는 유일한 별칭 예 A List[_]를 들어, 하나 개의 형식 매개 변수를 예상 유형,하지만 일반 클래스와도 작동합니다.

def foo(m: M[_]) = m 

잘못된 매개 변수를 사용하여 호출 :

scala> foo("a") 
<console>:15: error: type mismatch; 
found : String("a") 
required: M[_] 
    (which expands to) A[] 
     foo("a") 

내가 같은 오류가 나는 방법을 만드는 경우

. A[]의 의미는 무엇입니까? 더 나아가

, 어떻게 설명합니다 :

scala> type M[_, _] = A 
<console>:12: error: _ is already defined as type _ 
     type M[_, _] = A 

나는 매개 변수화 타입이 될 것입니다 내 별명의 오른쪽에 넣어 그 무엇을 보장 할 수있는 방법이 있나요?

+0

두 번째 질문 :'클래스 A [T <: AnyRef, U <: AnyVal]'및'유형 M = A [_, _]'무엇입니까? – Samar

+0

@Samar 이것은 매우 다른 상황입니다. –

답변

3

type M[_] = A은 유형에 상수 함수 인 type M[X] = A과 동일합니다. M[X]X는 무엇이든 A이다 M[Int]A이다 M[String]A이다 M[Any]은 (물론 type M[_, _] 대한 오류를 설명하는) 단순한 식별자이 경우 A_이다.

물론 def foo(m: M[_]) = m에서 M[_]M[T] forSome { type T }입니다. 스칼라가 오류 메시지에서 A[]으로 확장한다고 말하는 이유는 모르겠다. 이것은 버그 일 수 있습니다. 당신은

scala> implicitly[M[_] =:= A] 
res0: =:=[A[],A] = <function1> 

내 별명의 오른쪽에 넣어 무엇을 매개 변수화 유형이 될 것이라는 점을 보장 할 수있는 방법이 있나요를 호출하여이 A와 동일한 유형입니다 확인할 수 있습니까?

당신은 더 높은 종류

trait Foo { type M[_] } 

와 추상적 인 멤버 유형을 선언 할 수 있으며, 그것은 단지 매개 변수화 유형에 의해 구현 될 수있다 : 첫 번째 단락에서 언급 한 바와 같이, 물론

class Bar1 extends Foo { type M = Int } // fails 
class Bar2 extends Foo { type M[X] = List[X] } // works 

, M in type M[X] = Int입니다. 나는 그것을 배제 할 방법이 없다고 생각합니다.

+0

에는 스칼라 유형 시스템을 이해하는 데 헌신적 인 대학이 있습니까? 내가 어떻게 가입 할 수 있니? – Samar