2015-08-12 2 views
0

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

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]. Я достиг ограничения языка? Является ли подпись более высокого сорта метода слишком открытой, что делает невозможным компилятор, чтобы устранить эту проблему от другой? Есть ли более идиоматический подход к такого рода схемам перегрузки по параметрам типа?

ответ

0

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

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

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

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