2017-11-16 2 views
0

Ich verstehe nicht, den Titel Fehler, dass für diese Funktion zu wissen:Typenkonflikt, erwartet ListBuffer [Alle], tatsächliche ListBuffer [Custom]

def myFunction(objectList: ListBuffer[Any], `object`: Any): Boolean = {...} 

mit diesen Parametern aufgerufen:

myFunction(
    objectList // :ListBuffer[CustomClass], 
    customObject // :CustomObject 
) 

bin ich verpflichtet Funktion wie folgt zu nennen:

myFunction(
    objectList.asInstanceOf[ListBuffer[Any]], 
    customObject 
) 

Erzeugt Fehler Mismatch Typ nur für ListBuffer param Eter. Also CustomObject => Any ist in Ordnung, aber kein ListBuffer [CustomObject] => ListBuffer [Any]?

Danke

Antwort

1

Das ist, weil ListBuffer unveränderlich ist, so dass Sie nicht ListBuffer[A]-ListBuffer[SuperTypeOfA], der Grund dafür zuweisen kann, ist ListBuffer wandelbar ist, das zu machen Covaraint unsicher ist. https://docs.scala-lang.org/tour/variances.html

0

Sie verwenden Parametername Objekt, das ein Schlüsselwort in scala ist.

def myFunction(objectList: ListBuffer[Any], customObject: Any): Boolean = {...} 

Wenn Sie als Parametername Objekt möchten, verwenden Sie kippen Symbol vor sich her.

def myFunction(objectList: ListBuffer[Any], `object`: Any): Boolean = {...} 

Anderes Problem ist, dass Sie es nicht Jeder mit asInstanceOf machen können. So ändern ListBuffer [Alles] zu ListBuffer [Custom]

def myFunction(objectList: ListBuffer[CustomClass], customObject: Any): Boolean = {...} 
0

Mmm, so oder ist dies nicht die gute Sammlung zu verwenden, und es gibt eine bessere entweder ich es schlecht verwenden und muss nicht auf die Funktion geben, aber stattdessen in die Funktion initialisieren?

ich Seq nehme covariant sind, weil Funktion definieren, wie folgend, das funktioniert:

def myFunction(objectList: Seq[Any], object: Any): Boolean = {...} 
0

Wenn CustomObject und CustomClass tatsächlich sollen gleich sein (oder CustomObject ist ein Subtyp von CustomClass), können Sie wollen ändern, um die Funktion sein generic:

def myFunction[A](objectList: ListBuffer[A], object: A) = ... 

Ansonsten ist das Problem ist, dass myFunction alles in ein ListBuffer[Any] setzen kann, aber wenn man einen Pass ListBuffer[CustomClass] können nur Werte vom Typ CustomClass eingegeben werden. Dies erklärt, warum ListBuffer invariant ist.

Wenn myFunction wird nicht alles in die Buffer setzen, können Sie nur verwenden Seq (oder noch allgemeiner Art), die covariant ist. Sie können dort eine ListBuffer übergeben, weil es Seq erweitert. Im Allgemeinen ist es eine gute Richtlinie, Methodenargumenten den allgemeinsten Typ zuzuweisen.

Verwandte Themen