2015-01-12 6 views
4

경계를 "제외"하는 하한을 적용하여 스칼라의 유형 (예 : 인수 유형)을보다 세부적으로 제어 할 수 있습니다. 예를 들어 는스칼라에서 수퍼 유형

def foo[ S <: String ](arg: S): S = ... 

상기는 기능이 하위 인은 상기 상부의 설정을 할 수 있으며 그 S 있도록 하한

def bar[ S >: A <: B ](arg: S): S = ... 

또한 문자열의 하위 종류 인수를 받아 들일 수 있도록 B 유형과 A의 수퍼 유형이 있습니다.

내 질문에 인수 유형을 설정하여 인수가 말 (String)의 수퍼 유형이 될 수는 있지만 포함하지는 않습니다 일부 슈퍼 타입의 하한 (이 경우 문자열)은 Any 유형을 말합니다.

UPDATE

sealed trait Helper[S] 
object Helper { 
    implicit def stringSubtype[S >: String] = new Helper[S]{} 
    implicit def any = new Helper[Any]{} 
} 

def foo[S: Helper](r: S): Int = 1 

val arg1: String = "hi" 
val arg2: Any = "hello" 

foo(arg1) 
foo(arg2) 

내가 ARG2와 전화가 불법 인수 예외가 발생하는 것을 기대하는 것입니다. 이 당신이 implicits를 통해 입력 레벨의 프로그래밍을 할 수와 같은 더 복잡한 유형의 제약 조건에 대한

답변

3

:

sealed trait Helper[S] 
object Helper { 
    implicit def stringSubtype[S >: String] = new Helper[S]{} 
    implicit def any = new Helper[Any]{} 
    implicit def any2 = new Helper[Any]{} 
} 

def foo[S: Helper] = ... 

foo은 암시 적 Helper[S]가 해결 될 수있는 유형 S로 호출 할 수 있습니다. stringSubtypeS >: String에 대해 Helper[S]을 제공합니다. 그러나 Any의 경우 해당 값과 any이 모두 적용되고 두 implicits가 충돌하므로 foo[Any]을 호출 할 수는 없습니다 (물론 둘 중 하나를 명시 적으로 전달하는 것만 제외하고).

업데이트 : anystringSubtype보다 다소 우선 순위가 높으므로 foo[Any]으로 해결됩니다. 이것이 왜 정확한지 알아 내기보다는 가장 간단한 해결 방법은 any2을 정의하는 것입니다.

+0

답변 주셔서 감사합니다. 사용하고 싶지만 원하는 결과를 얻을 수 없습니다. 질문에 추가 한 업데이트를 살펴보십시오. –

+0

그냥 대답에 대한 업데이 트가 질문에 업데이 트를 해결하는 것 같아 :). 미스터리는 스칼라 2.12.2에서 정확히 any2가 남아있는 이유에 대한 것임을 알 수 있습니다 (그리고 dotty : https://scastie.scala-lang.org/bbarker/VRGskOyrRyaRKWIOeJ8FUA/1). – bbarker

관련 문제