2012-10-24 2 views
7

호출 한 클래스의 타입을 항상 반환하는 메소드를 만들 수 있습니까?스칼라에서 이것의 타입

는 설명해 드리죠 :

class Shape { 
    var mName: String = null 
    def named(name: String): Shape = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
    override def named(name: String): Rectangle = { 
    super.named(name) 
    this 
    } 
} 

이 작동하지만 내 서브 클래스의 모든에서 named 함수를 재정의 할 필요없이이 작업을 수행 할 수있는 방법이 있나요? 내가 뭔가를 찾고 있는데요 (작동하지 않습니다) :

class Shape { 
    var mName: String = null 
    def named(name: String): classOf[this] = { // Does not work but would be great 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

어떤 생각? 아니면 불가능한가요?

답변

18

classOf[this] 대신 this.type을 사용해야합니다. classOf이를 얻기 위해 런타임에 호출되는 연산자 동안 지금

class Shape { 
    var mName: String = null 
    def named(name: String): this.type = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

scala> new Rectangle().named("foo") 
res0: Rectangle = [email protected] 

scala> res0.mName 
res1: String = foo 

this.type는 컴파일 형 타입의 이름이 (스칼라 2.8) 작동 함을 입증하기에 java.lang.Class 개체입니다. 매개 변수가 형식 이름이어야하므로 classOf[this]을 사용할 수 없습니다. java.lang.Class 개체를 얻으려고 할 때 두 가지 옵션은 classOf[TypeName] 또는 this.getClass()으로 전화하십시오.

+0

'this'가 아닌 인스턴스에는 싱글 톤 유형을 사용할 수 없다는 점을 언급 할 필요가 있습니다. – pedrofurla

+0

@pderofurla : 경로 의존형에서는 가능해야하지만, 스칼라에서는 경로 의존형에 대해서는 거의 알지 못합니다. 아직 실험 중인지 여부도 확실하지 않습니다. –

+0

필자는 경로 의존형과 전혀 관련이 없다고 생각합니다. 경로 의존형은 실험적이지 않습니다. – pedrofurla

관련 문제