2017-01-02 1 views
0

Ich habe definiert die folgenden Klassen:In scala, warum Typ Alias ​​in einer Klasse kann nicht für die Vererbung verwiesen werden?

Datei: PyRef.scala:

package mypackage 
class PyBinding() { 
... 
} 

trait PyRef { 

    type Binding = PyBinding 
} 

Datei: Link.scala:

class Link() extends PyRef { 

    override type Binding = Link.PyBindingImpl 
} 

object Link { 
    class PyBindingImpl() extends PyRef#Binding() { 
    } 
} 

In Zusammenstellung wurde der folgende Fehler ausgelöst:

Error:(222, 34) class type required but mypackage.PyBinding found 
       ) extends PyRef#Binding() { 

Warum passiert das und was soll ich tun, um es zu umgehen? Ich benutze Scala 2.10.

+0

Ich glaube, Sie versuchen, etwas zu bauen, mit [typeclasses] (https://tpolecat.github.io/2015/04/29/f-bounds.html) und [die Aux-Muster] (https://gigiigig.github.io/posts/2015/09/13/aux-pattern.html). – Reactormonk

+0

Deklarationstyp Binding als Kovariante oder Binding <: PyBinding bricht ein paar andere Funktionen typcheck, ich bin mir nicht sicher, ob es sich lohnt. – tribbloid

+0

@tribboid ... Ich habe dir einen schlechten Dokumentarfilm gegeben, bei dem du den Punkt verpasst hast. Versuchen Sie dieses: http://typelevel.org/cats/typeclasses.html – Reactormonk

Antwort

0

Ich glaube nicht, dass Sie Typ-Projektionen A#B in Scala als instanziatable Klassenarten verwenden können. Die folgenden zwei Dinge funktionieren

trait Link { 
    class PyBindingImpl() extends PyBinding() 
} 

trait Link { 
    val ref: PyRef 

    class PyBindingImpl() extends ref.Binding() 
} 
Verwandte Themen