2010-11-23 2 views
4

내 스칼라 코드에서 암시 적 변수를 사용하여 실험하고 있습니다. 다음 샘플 코드를 작성했지만 불행히도 컴파일에 실패합니다. 내가 궁금해 하던데, 아무도 여기서 무엇을 놓치고 있는지 알고 있니?특성에 추상 형식 classof 액세스하는 스칼라

감사 (리눅스에 SBT 0.7.4와 스칼라 2.8.0을 사용하여), 알리

trait Feed 
trait FeedFactory { 
type T <: Feed 
implicit val op_name = classOf[T].getCanonicalName  
def create():T 
def destroy(op:T) 
} 

Error: class type required but FeedFactory.this.T found  
implicit val op_name = classOf[T].getCanonicalName 

답변

5

T 타입은 컴파일 시간 (유형 삭제 참조)에서 잊고있다. 그러나 scala는 컴파일을 통해 유형을 유지하는 Manifest을 제공합니다.

여기에 더 완전한 explanation입니다.

+0

감사합니다. 암시적인 val을 사용하여 수정했습니다. op_name = { def op_name [T] (암시 적 m : scala.reflect.Manifest [T]) = {m.getClass.getCanonicalName}; op_name}하지만 암묵적인 변수를 정의 할 필요가 있기 때문에보기 흉한 것처럼 보입니다. 더 좋은 방법이 있습니까? –

+1

@Ali with scala 2.8, def op_name [T : Manifest] = 암시 적으로 [Manifest [T]]를 사용할 수 있어야합니다. getClass.getCanonicalName' – shellholic

+0

알리 솔루션이 작동하지 않습니다. 항상 Nothing을 반환합니다. 당신은 아마 val op_name = {def op_name [T] (implicit m : scala.reflect.Manifest [T]) = {m.getClass.getCanonicalName};을 작성해야합니다. op_name [T]} 그리고 오류 : X.this.T에 사용할 수있는 Manifest가 없습니다. –

관련 문제