2011-09-09 2 views
9

특정 유형으로 매개 변수화 된 매개 변수화 된 유형을 금지하는 방법이 있습니까?특정 유형의 매개 변수화를 허용하지 않는 스칼라

List [Nothing]이 합법적이지 않거나, 즉 컴파일 오류를 발생시키지 않기를 원하는 곳에 내 자신의 전문화 된 List [T] 유형을 만들고 싶다고 가정 해보십시오. 내가 잡을 다음과 같은 오류가 더 쉽게 만들 수있는 방법을 찾고 있어요

(예, 나는이 스칼라 매우 기능적 또는 크지 않다 이해) :

val x = ListBuffer() 
x += 2 

x는 ListBuffer [아무것도]를 입력있다.

답변

10

작품의 이런 종류의,

class C[A](x: A*)(implicit ev: A =:= A) { } 

A = Nothing가 추정되는 경우,

val c1 = new C[Int]() // Ok 
val c2 = new C(1)  // Ok, type `A = Int` inferred 
val c3 = new C()  // Type error, found (Nothing =:= Nothing) required: (A =:= A) 

유형의 오류가있을하지만 여전히 명시 적으로

형식 매개 변수 A Nothing로 설정하는 것이 가능합니다
val c4 = new C[Nothing]() // Ok 

더 일반적으로, etala는 Scala에서 두 유형이 동일하지 않게하기 위해 까다로워합니다. 이전 질문 herehere을 참조하십시오. 하나의 접근법은 동등한 유형이 모호한 함축으로 이어질 상황을 설정하는 것이다.

+3

변경 가능한 컬렉션에 대해 기본값이되어야하는지 궁금합니다. 적은 수의 사람들이 형식을 잊어 버릴 수 있지만 필요한 경우 사용할 수있는 것이 없습니다. – soc

2

Null이 맨 아래에서 두 번째이고 모든 유형과 공분산되기 때문에 특히 Nothing을 피하려는 경우 유형 A> : Null을 정의 할 수 있습니다. 따라서이 반동에 Nothing을 제외한 모든 유형이 포함됩니다.

유형 경계가 여전히 Null을 포함하기 때문에 얼마나 유용할지 확실하지 않습니다.

관련 문제