2016-04-12 20 views
1

örtükscala yazarak gerektiren ben bir ebeveyn genel sınıf</p> <pre><code>abstract class ResultProvider[+T: Writes](db: DB) { def get(id: Long): Future[Seq[T]] } </code></pre> <p>Ve bazı uygulamalar, örneğin var</p> <p>aşağıdaki oluşturmaya çalışıyorum

class LengthProvider(db: DB) extends ResultProvider[LengthResult](db){ 
    override def get (userId: Long): Future[Seq[LengthResult]] = ... 
} 

object LengthProvider extends ((DB) => DisciplinePredictor) { 
    override def apply(db: DB) = new LengthProvider(db) 
} 

Ayar haritası vardır:

val providers: Map[String, ((DB) => ResultProvider[???])] = Map(
    "length" -> LengthProvider, 
    "width" -> WidthProvider, 
    ... 
) 

Sorum ben ??? yerine koymak gereken budur. İdeal olarak, gibi bir şey olmalı, sadece bu tür Writes örtük uygulandığından, Json.toJson'a gidiyorum. Any ile derlenecek, ancak sınıfın Writes örtük uyguladığı bilgiler kayboluyor. Veya farklı bir yaklaşım kullanmalı mıyım? Muhtemelen tüm sonuç vaka sınıflarım için bir süper sınıf oluşturabilirim (örneğin, LengthResult), ancak bu durumdan kurtulmak istiyorum.

+0

'T yazıyor:' Yazıyor –

+0

@AlexanderArendar Bu hiç de istenen bir şey değil. –

cevap

1

Sen ResultProvider[_] (Eğer bu sözdizimi aşina değilseniz "varoluşsal türleri" arayışını) yazma gerekir, ancak örtülü bir isim vermek gerekir: Başka bir yerde

abstract class ResultProvider[+T](db: DB)(implicit val writes: Writes[T]) { ... } 

:

val provider: ResultProvider[_] = providers("length") 
import provider.writes // makes the implicit visible here 
... 

bir tür değişkeni sağlayarak (eğer türünü adlandırmak gerekirse, kendinizi ya) sen derleyici yardım gerekebilir:

providers("length") match { 
    case provider: ResultProvider[a] => 
    import provider.writes 
    ... 
} 
+0

Çalıştı! Derleyiciye neden bir tür değişkeni (yani a') ile yardım etmem gerektiğini açıklayabilir misiniz? Aksi halde işe yaramıyor. –

+0

Ne yazık ki, bu, derleyicinin anlamadığım tür çıkarımının ayrıntılarına bağlı. Daha önce benzer durumlarda bulundum. –