다음과 같이 대략적으로 달성하려고 노력 중입니다.스칼라에서 공용체 유형을 사용하는 일반 데이터 구조
/* I assume that we have some types S and T */
sealed trait Container[U]
class SContainer(s: S) extends Container[S]
class TContainer[U <: T](u: U) extends Container[U]
/* this requires something more */
def invoke[U](f: String => U): Container[U]
간단히 말하면, S
유형 또는 T
의 부속 유형 인 것을 보유 할 수있는 Container
클래스가 필요합니다. Container
클래스는 컨테이너를 구성하는 데 가능한 두 가지 방법 만 있으므로이 속성을 분명히 충족시킵니다.
그러나 이제 컨테이너에 값을 래핑하는 invoke
함수를 만들려고합니다. 내 예제에서 주어진 정의는 U
에 아무런 제한을 두지 않기 때문에 명확하게 작동하지 않는다.
유감스럽게도 erasure 타입 덕분에 우리는 두 개의 함수를 정의 할 수 없습니다 :
def invoke(f: String => S): Container[S]
def invoke[U <: T](f: String => U): Container[U]
런타임 중에는 같은 타입을 가지기 때문입니다.
invoke
에 이러한 유형 제한을 표현하는 방법은 무엇입니까?
. 'TContainer'는'Container [T]'의 부속 유형이되도록 정의하고,'invoke'는'Container [U]'를 반환하기를 원합니다. 먼저 컨테이너 (Container [T]) 또는 컨테이너 (Container [U])를 원할지 결정해야합니다. –
와우. 당신은 틀림없이'Container [U]'이어야합니다. – andri