2012-10-24 5 views
7

Есть ли способ сделать метод всегда возвращать тип того же класса, который его назвал?Тип этого в Scala

Поясню:

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

Вам необходимо использовать this.type вместо classOf[this].

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

class Rectangle extends Shape { 
} 

Теперь, чтобы продемонстрировать, что он работает (в Scala 2.8)

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

scala> res0.mName 
res1: String = foo 

this.type это имя типа компиляции типа, в то время как classOf оператор, который вызывается во время выполнения для получения java.lang.Class объект. Вы не можете использовать classOf[this], потому что параметр должен быть именем типа. Ваши два варианта при попытке получить объект java.lang.Class - это позвонить classOf[TypeName] или this.getClass().

+0

Следует отметить, что одноэлементный тип не может использоваться для экземпляров, которые не являются «этим». – pedrofurla

+0

@pderofurla: Казалось бы, это должно быть возможно с зависимыми от пути типами, но я мало знаю о зависимых от пути типах в Scala, и я даже не уверен, что они все еще экспериментальные. –

+0

Я не думаю, что это связано с зависимыми от пути типами. И нет, зависящие от пути типы не являются экспериментальными. – pedrofurla

Смежные вопросы