2014-11-03 4 views
6

동일한 기본 형식을 공유하는 다른 형식 별칭을 할당 할 때 컴파일 시간 오류 (또는 적어도 경고)를 얻을 수있는 방법이 있습니까?스칼라 : 형식 별칭 불일치시 컴파일 오류 적용

val city: City = "Dublin" 
foo(city) 

를 지금까지 내가의를 말할 수 : 내가 할 경우 내가 경고/컴파일 시간 오류가 발생 할

type Address = String 
type City = String 

def foo(x:Address) = ... 

: 즉

, 나는이 코드를 가지고 있다고 컴파일러는 동일한 기본 유형이기 때문에 허용합니다.

답변

4

내가 알고있는 한, 유형 별칭을 찾는이 "유형 안전성"을 얻는 것은 불가능합니다. 그러나 원하는대로 사용할 수있는 별칭을 입력하는 대신 Value Classes을 사용할 수 있습니다. 기본적으로 값 클래스는 새 객체를 할당하지 않고 유형을 제공 할 수 있습니다. 유형 별칭에없는 값 클래스에는 몇 가지 제한 사항이 있습니다.

정확성 값 클래스

또 다른 사용 사례는 런타임 할당 오버 헤드없이 데이터 형식의 유형 안전을 얻을 수 있습니다 :

은 스칼라 문서를 인용합니다. 같은

val x = new Meter(3.4) 
    val y = new Meter(4.3) 
    val z = x + y 

하지 않습니다 실제로이 개 거리를 추가

class Meter(val value: Double) extends AnyVal { 
    def +(m: Meter): Meter = new Meter(value + m.value) 
    } 

코드, 예를 들어, 거리를 나타내는 데이터 형식의 조각처럼 보일 수 있습니다 Meter 인스턴스를 할당하지만 런타임에 기본 double을 사용합니다.

+0

가치 사례 클래스를 만들 수 있습니까? 새로운 키워드 사용법을 조금 싫어합니다. –

+0

값 케이스 클래스를 정의 할 수 있습니다. 그건 그렇고 :'new' 키워드를 생략 할 수있는 이유는 (생성 된) 컴패니언 객체의'apply' 메소드이기 때문에 반드시 키워드를 없애기 위해 케이스 클래스를 정의 할 필요는 없습니다. –

+0

예, 저는 모든 타입 별칭에 대해 내 동료를 정의하는 것을 선호하지 않습니다. 길고 지루합니다^_ ^ –

3

호는 적어도 컴파일러를 수정하지 않고 (그것은 컴파일러 플러그인, 또는 매크로 가능 수 있습니다)하지, 당신은 다음이 변경 인기있는 라이브러리를 많이 한 경우 (표준 등 라이브러리) 및 표준 코드 예제는 컴파일되지 않습니다.

@ Kulu의 대답에 설명 된대로 값 클래스를 사용하는 것이 좋습니다. 또는 Scalaz Tagged Types은 더 많은 상황에서 오버 헤드를 방지합니다 (예 : 컬렉션에 넣거나 subst을 사용하여 태그가 지정된 유형을 사용하는 제네릭 형식을 안전하게 상영 함).