Scala, доступ к классу абстрактного типа в трейте

Я экспериментирую с неявными переменными в своем коде Scala. Я написал следующий пример кода, но, к сожалению, он не компилируется. Мне было интересно, кто-нибудь знает, чего здесь не хватает? (используя scala 2.8.0 с SBT 0.7.4 в Linux)

Спасибо, Али

trait Feed 
trait FeedFactory  {   
type T <: Feed   
implicit val op_name = classOf[T].getCanonicalName    
def create():T   
def destroy(op:T)   
}

Error: class type required but FeedFactory.this.T found    
implicit val op_name = classOf[T].getCanonicalName

person Ali Salehi    schedule 23.11.2010    source источник


Ответы (1)


тип T забывается во время компиляции (см. стирание типов). Но scala предлагает Manifest, которые сохраняют тип при компиляции.

Вот более полное объяснение.

person shellholic    schedule 23.11.2010
comment
Спасибо, я исправил это с помощью неявного val op_name = { def op_name[T](implicit m : scala.reflect.Manifest[T]) = {m.getClass.getCanonicalName}; op_name } но я чувствую, что это выглядит довольно уродливо, так как мне нужно определить неявную переменную, есть ли лучший способ сделать это? - person Ali Salehi; 23.11.2010
comment
@Ali со scala 2.8, вы сможете использовать def op_name[T:Manifest] = implicitly[Manifest[T]].getClass.getCanonicalName - person shellholic; 23.11.2010
comment
Али, ваше решение не работает. Он всегда ничего не возвращает. Вероятно, вам следует написать val op_name = { def op_name[T](implicit m: scala.reflect.Manifest[T]) = {m.getClass.getCanonicalName}; op_name[T] } и пишет об ошибке: нет доступных манифестов для X.this.T - person Wojciech Durczyński; 21.08.2013