2012-06-18 4 views
1

개체의 필드/메서드를 형식에 바인딩하는 방법은 무엇입니까?개체의 필드/메서드 바인딩

내가 할 노력하고 있어요 :

object CRUDable { 

    private val allCRUDables = scala.collection.mutable.Map[String, CRUDableMeta[_]]() 
    def add(crudable: CRUDableMeta[_]) { allCRUDables += (crudable.name -> crudable) } 

내 컴파일러 SAIS 그 :

type arguments [_$5] do not conform to trait CRUDableMeta's type parameter bounds [T <: etam.jpa.crud.CRUDable[T]] 

나는지도 CRUDableMeta [_]의 모든 유형을 수용해야합니다.

미리 감사드립니다. Etam.

답변

0

은 내가 CRUD를 모르기 때문에, 일반적인 경우를 구성하는 자유를 복용하고 그것은 역할 재생되지 않습니다

trait Data[T] 
trait Meta[T <: Data[T]] { def name: String } 
val all = collection.mutable.Map[String, Meta[_]]() 

지금 컴파일러가

잘못 정확히 알려줍니다를
def add(c: Meta[_]) { all += c.name -> c } 

은 말한다 : 스칼라가 할 수있는 동안

error: type arguments [_$1] do not conform to trait 
     Meta's type parameter bounds [T <: Data[T]] 

그래서 당신이 Map을 구성 불평하지 않고 (솔직히 왜 그런지 모르겠다.) 맵에 실제로 값을 저장하려고 시도 할 때 Meta의 유형 매개 변수 T의 범위를 실행합니다.

해결 방법은 다음 양식 중 하나를 사용하는 것입니다. (1) 방법에 대한 매개 변수를 입력합니다

def add[T <: Data[T]](c: Meta[T]) { all += c.name -> c } 

(2) 실존 적 유형

def add(c: Meta[T] forSome { type T <: Data[T] }) { all += c.name -> c } 

(2), 나는 실존 유형 모두에 대해 무엇을 잊고 계속에 대해 물어하지 마십시오 .. 아마도 다른 사람이 (1) 또는 (2)가 더 나은지에 대한 통찰력을 제공 할 수 있습니다. (the only answer to a related question은 (1)과 (2)가 거의 동일하다는 것을 암시합니다. (1) 또한 나중에 T 유형을 참조 할 수 있습니다. 여기서는 필요하지 않지만 더 읽기 쉬운 버전입니다.)

관련 문제