2014-04-01 2 views
2

나는 scala에 익숙하지 않고 implicits의 개념에 어려움을 겪고있다. 그 C를 알고Implicits and type definitions

val myInstanceOfSomeClass = SomeClass[C, D] 

: 내가 좋아하는 것

class SomeClass[A <: AA, B <: BB](val someParameter: String) 

다른 유형은 다음과 같이, AA와 BB에서 상속하지이 클래스를 사용하는 :

I 클래스는 다음과 같이 정의되어 와 D (도움이되는 Java 클래스)는 생성자 덕택에 AA 및 BB 인스턴스로 변환 할 수 있습니다.

myInstanceOfSomeClass 값은 다른 함수에서 SomeClass [C, D] 유형의 매개 변수로 사용됩니다.

나는 그것이 암시 적 정의에 관한 것을 알고하지만 난 꽤 구문을 잃었어요, 특히 어디에 어떻게 내가 내재 된 정의를 정의해야합니다 ... 그래서

, 어떻게 다른 유형 내 SomeClass를 사용할 수 있습니다 정의 된 유형으로 변환 할 수 있습니까?

편집 : SomeClass[A <: AA, B <: BB]의 정의는 외부 라이브러리에서 가져온 것으로서 직접 수정할 수 없습니다.

답변

2

문자 아형뿐만 아니라하는 것과 같은 암시 적 변환이 사용의 시점에서 볼 수 있습니다를 포함하여 <: 제약 조건을 느슨하게 <%로 표기 「바운드보기 "라는 바인딩 관련 유형이있다.

그래서 당신이해야 할 모든 변경 당신의 이것에 SomeClass :

class SomeClass[A <% AA, B <% BB](val someParameter: String) 

... 그리고, 물론, 그 클래스를 사용 할 위치 암시 변환을 사용할 수 있는지 확인합니다. 이것은 당신이 변환에 implicit 키워드를해야합니다 의미

implicit def myAInstance(someCValue : C) : A = new A(someCValue) 
+0

내가 내 게시물에 명확하지 않았다 생각 미안하지만 클래스 SomeClass '의 정의를 변경할 수 없습니다 [A <: AA , B <: BB> (val someParameter : String)'를 호출합니다. 이것은 내가 "이 방법으로 클래스를 사용하고 싶습니다. val myInstanceOfSomeClass = SomeClass [C, D]"라고 말한 것입니다. 질문을 편집하고 있습니다. – user3485809

+0

그러면 운이 좋지 않으므로 명시 적으로해야합니다. 전환을 적용하십시오 (당연히 '내재적'일 필요는 없습니다). –

+0

음 ... 어떻게 든 만들 수 있다고 생각했는데 ... 어쨌든, 고마워요. 당신의 대답을 받아 들여야합니까? – user3485809