Ausgabe
Ich bin Scala-Anfänger. Ich habe einen Zweifel beim Versuch, Sammlungen zu implementieren.
class MyLinkedHashMap[K, V] {
var initialCapacity = 16
private var index = 0
var map: Array[Node[K, V]]
var head: Node[K, V]
var tail: Node[K, V]
class Node[K, V] {
var key: K;
var value: V;
var next: Node[K, V]
var before: Node[K, V]
var after: Node[K, V]
def Node(key: K, value: V, next: Node[K, V]) {
this.key = key
this.value = value
this.next = next
}
}
def MyLinkedHashMap() {
map = new Array[Node[K, V]](initialCapacity)
}
def MyLinkedHashMap(initialCapacity: Int) {
if (initialCapacity < 0) {
throw new IllegalArgumentException();
}
map = Array[Node[K, V]](initialCapacity)
}
private def hash(key:K): Int = {
return Math.abs(key.hashCode()) % initialCapacity
}
def put(key: K, value: V): Unit = {
if (key == null) {
return;
}
var hashIndex = hash(key)
val newNode = new Node[K, V](key, value, null)
}
}
Der Fehler, den ich bei Zeile Nr. 42 bekomme, ist
Zu viele Argumente für Konstruktor Node
Wenn ich jedoch die Klasse Node im Objekt von MyLinkedHashMap deklariere, erhalte ich diesen Fehler nicht. Ich wollte den Grund für diesen Fehler wissen.
Und ich wollte nicht, dass die Node-Klasse abstrakt ist, aber der folgende Fehler wird ausgelöst, wenn sie nicht als abstrakt deklariert wird.
Klasse ‘Node’ muss entweder abstrakt deklariert werden oder abstraktes Mitglied ‘next: Node[K, V]’ in ‘MyLinkedHashMap.Node’ implementieren
Warum muss die Node-Klasse abstrakt sein?
Lösung
Der Fehler, den ich bei Zeile Nr. 42 bekomme, ist
Zu viele Argumente für Konstruktor Node
Hier rufen Sie Node
den Konstruktor von mit drei Argumenten auf:
new Node[K, V](key, value, null)
Aber hier definieren Sie den Node
primären Konstruktor der Klasse ohne Parameterliste:
class Node[K, V]
Und es ist auch kein Hilfskonstruktor definiert.
Der einzige Konstruktor, der existiert, Node
ist also derjenige, der keine Parameter akzeptiert, aber Sie rufen ihn mit drei Argumenten auf.
Wenn Sie einen Konstruktor mit drei Argumenten aufrufen möchten, müssen Sie einen Konstruktor (wahrscheinlich den primären Konstruktor) definieren, der drei Parameter akzeptiert, etwa so:
class Node[K, V](var key: K, var value: V, var next: Node[K, V])
Beantwortet von – Jörg W. Mittag
Antwort geprüft von – Katrina (FixError Volunteer)