2014-10-14 12 views
5

In questo momento la mia caratteristica ha un tipo extra T che non ha altro utilizzo se non quello di garantire che B e R abbiano lo stesso tipo generico.Come chiedere lo stesso tipo nei generici Scala senza introdurre un terzo parametro di tipo?

trait GenericBuilder[T <: Any, B <: Builder[T], R <: Result[T]]

Per semplificare la dichiarazione, mi domando se c'è un modo per eliminare T in questo caso, pur mantenendo il tipo severità.

EDIT: Non ho il controllo del codice Builder o Result - si sono tirati in da alcuni manufatti java fuori.

risposta

2

Se si desidera solo per semplificare quella parte della dichiarazione è possibile spostare i tipi in membri, ma poi si finisce per dover carrello intorno ulteriori informazioni perché avete bisogno di un testimone che i tipi sono gli stessi:

trait Builder { 
    type T 
} 
trait Result { 
    type T 
} 
trait GenericBuilder[B <: Builder, R <: Result] { 
    val w: B.T =:= R.T 
} 
+0

Penso che '=. =' È deprecato. – goral

+0

Non sono a conoscenza di alcuna deprecazione. Scalaz === è migliore, ma ciò conta solo se hai uno dei casi d'uso che ne hanno bisogno; =: = è sufficiente per l'esempio. – lmm

+0

La sintassi è corretta? Dovrebbe esserci un "=" dopo il tipo esterno? Anche dove dovrei posizionare i tipi? Se li metto al di fuori della classe, ricevo un errore "errata dichiarazione di dichiarazione superiore". Collocarli all'interno della classe ovviamente non fa nulla. Anche Builder è il mio nome tratto ma il tipo di alias sembra nasconderlo? – NSF

Problemi correlati