5

나는 F-경계 형 Sys이 호출 된 Foo :실존 유형 또는 유형 매개 변수 바인딩 실패

def invoke[S <: Sys[S]](foo: Foo[S]) =() 

모델 업데이트 유형이 있다고 가정합니다. 이는 DA 서브 타입은 운반 Foo :

sealed trait Update 
case class Opened[S <: Sys[S]](foo: Foo[S]) extends Update 

모델 관찰자 등록하기위한 헬퍼 기능 : 지금

def observe(pf: PartialFunction[Update, Unit]) =() 

다음이 실패

observe { 
    case Opened(foo) => invoke(foo) 
} 

으로 , Foo, invoke, Update, Openedobserve가 주어지면 3,516,

어떻게, 부분적인 기능를 해결할 수 있습니다. Foo에 값 또는 유형 멤버를 추가 할 수 있습니다.

observe { 
    case Opened(foo) => invoke(foo.asInstanceOf[Foo[~] forSome { type ~ <: Sys[~] }]) 
} 

은 물론이 끔찍한 아니라 선호하는 솔루션이다, 그래서 다른 답변을 기다리고 :

답변

0

가능한 솔루션을 캐스팅입니다. 이동 유형 매개 변수에 대한 특성 변수 입력 할 수있는 방법

1

:

trait Sys[S <: Sys[S]] 
trait Foo { type S <: Sys[S] } 

sealed trait Update 
case class Opened(foo: Foo) extends Update 

def invoke(foo: Foo) =() 
def observe(pf: PartialFunction[Update, Unit]) =() 

observe { 
    case Opened(foo) => invoke(foo) 
} 

업데이트 :

당신은 절대적으로 옳다. 그리고 모든 새로운 유형 대체에 대해 body에 대한 move 유형 매개 변수의 별칭을 정의해야합니다.

유형 별칭 예 :

trait Sys[S <: Sys[S]] 
class A extends Sys[A] 
class B extends Sys[B] 

trait Foo { type S <: Sys[S] } 
trait Boo { type S <: Sys[S] } 

object module_A{ 
    type Foo = com.company.Foo { type S <: A } 
    type Boo = com.company.Boo { type S <: A } 
} 

def invoke(foo: module_A.Foo, boo: module_A.Boo) =()   
+0

문제는이 즉시 무심되고있다가, 내 모든 API는 타입 생성자 매개 변수를 기반으로합니다. 당신은 곧'def foo [S1 <: Sys [S1]] (바 : Bar {type S = S1}, baz : Baz {type S = S1}) : 가가 {type S = S1}'등을 갖게됩니다. –