Методи за разширение с граници на изглед, зависещи от разширен обект

Опитвам се да дефинирам някои методи за разширение за клас, както е показано по-долу. Един от методите трябва да приеме аргумент, който може да се преобразува в тип, зависим от пътя, който включва разширения обект в своя път. За съжаление, компилацията е неуспешна на сайта за повикване, тъй като компилаторът изглежда не разпознава, че препратката към „outer“ в дефиницията на границите на изгледа се отнася до същия обект като „outer“ на сайта за повикване. Има ли начин да се поправи това, така че коментираният ред да се компилира?

import scala.language.implicitConversions

class Outer {
  class Inner {
  }

  class ConvertsToInner {
  }

  object ConvertsToInner {
    implicit def convert(source : ConvertsToInner) = new Inner()
  }
}

class Code {
  implicit class ExtendsOuter(val outer : Outer) {
    def extensionMethod[T <% outer.Inner](argument : T) { }
  }

  val outer = new Outer()
  val convertsToInner = new outer.ConvertsToInner()

  //does not compile!
  outer.extensionMethod(convertsToInner)
}

person Nimrand    schedule 30.11.2013    source източник


Отговори (1)


Заменете дефиницията на метода на разширение от:

def extensionMethod[T <% outer.Inner](argument : T) { }

to

def extensionMethod[T <% Outer#Inner](argument : T) { }
person Shyamendra Solanki    schedule 30.11.2013
comment
Всъщност в този случай трябва да е външен. Вътрешен. - person Nimrand; 01.12.2013