Перегрузка конструктора типов типами более высокого порядка и доступ к параметру конструктора типов

У меня есть метод без параметров значения, который я хочу перегрузить другим методом, использующим конструктор более высокого типа. Я также хочу использовать параметр конструктора типа в теле метода. Я также хочу захватить тег класса. Это то, что я думаю, должно быть возможно:

trait SomeContainer[+A]
trait Foo[+A]

class SomeClass {
  // The simple variant
  def method[T <: AnyRef]: Foo[T]

  // Now the overloaded higher-kinded variant
  def method[F[T <: AnyRef : Manifest] <: SomeContainer[T]]: Foo[T] = {
    val classTag = manifest[T]
    // Do something with it
  }
}

Однако у меня вообще нет доступа к T здесь. Цель здесь состоит в том, чтобы заставить метод более высокого типа перегрузить метод не более высокого типа def method[T <: AnyRef]: Foo[T]. Я достиг ограничения языка? Является ли сигнатура метода не более высокого типа слишком открытой, что делает невозможным для компилятора устранение неоднозначности одного от другого? Есть ли лучший более идиоматический подход к такому шаблону перегрузки параметров типа?


person Jonathan Neufeld    schedule 12.08.2015    source источник


Ответы (1)


Вы вообще не можете перегружать методы, основанные только на параметрах типа, так как они не существуют в JVM: насколько это касается, оба метода def method(): Foo. Технически компилятор мог бы разрешить это, дав перегруженным методам разные имена в байт-коде, но ни Java, ни Scala этого не делают.

Есть ли лучший более идиоматический подход к такому шаблону перегрузки параметров типа?

Вы можете дать одному из методов фиктивный неявный параметр (для этого в Predef есть тип DummyImplicit).

person Alexey Romanov    schedule 12.08.2015