[FIXED] Scala – Objekt & Klasse

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 Nodeden Konstruktor von mit drei Argumenten auf:

new Node[K, V](key, value, null)

Aber hier definieren Sie den Nodeprimären Konstruktor der Klasse ohne Parameterliste:

class Node[K, V]

Und es ist auch kein Hilfskonstruktor definiert.

Der einzige Konstruktor, der existiert, Nodeist 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like