Heim >Java >javaLernprogramm >Warum kann die Methode „assertThat' nicht kompiliert werden, wenn „Map' verwendet wird?

Warum kann die Methode „assertThat' nicht kompiliert werden, wenn „Map' verwendet wird?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-13 11:54:02172Durchsuche

Why does the `assertThat` method fail to compile when using `Map

Java Generics: vs. in Methodensignaturen

Mit Java-Generika können Sie typsichere Sammlungen und Methoden erstellen, die mit einer Reihe von Datentypen arbeiten können. Verstehen Sie bei der Verwendung von Generika den Unterschied zwischen und ist von entscheidender Bedeutung.

Betrachten Sie das folgende Beispiel:

Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<Date>> result = null;
assertThat(result, is(expected));

Dieses Beispiel generiert einen Kompilierungsfehler mit der folgenden Meldung:

Error: cannot find symbol method assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>, org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class<? extends java.io.Serializable>>>)

Warum funktioniert diese Version Kompilierung fehlgeschlagen?

Der Grund liegt in der Verwendung von in der Matcher-Klasse. In seiner ursprünglichen Form erfordert „asserThat“ einen Matcher, der genau mit dem Typ von T übereinstimmt. In unserem Beispiel haben wir jedoch eine Zuordnung von „String“ zu „Class, wobei der Schlüssel vom Typ String und der Wert vom Typ Class. Da unsere Ergebniskarte Class enthält, was ein Untertyp von Class< ist. erweitert Serializable>, kann der Compiler nicht garantieren, dass der Matcher mit der erwarteten Karte kompatibel ist.

Was ist der Nachteil beim Ändern von „assetThat“ in „Matcher<“? erweitert T>?

AssertThat in Matcher< ändern? erweitert T> ermöglicht es uns, einen Matcher zu übergeben, der mit einem Supertyp von T übereinstimmt. Auch wenn dies wie eine einfache Änderung erscheinen mag, kann sie zu unerwartetem Verhalten führen. Wenn wir beispielsweise einen Matcher haben, der mit einer Liste von Strings übereinstimmt, könnten wir ihn an eine Methode übergeben, die einen Matcher für eine Liste von Objekten erwartet. In diesem Fall wäre der Matcher nicht in der Lage, den tatsächlichen Parameter korrekt abzugleichen, was möglicherweise zu falschen Ergebnissen führen würde.

Ist es sinnvoll, die Methode „asserThat“ in JUnit zu generisch zu machen?

Die Generisierung von „asserThat“ in JUnit zielt darauf ab, die Typsicherheit zu gewährleisten und Nichtübereinstimmungen zwischen erwarteten und tatsächlichen Typen zu verhindern. Allerdings kann es, wie oben besprochen, auch zu potenziellen Problemen führen, wenn es nicht sorgfältig angewendet wird.

Empfehlung

Bei der Entscheidung zwischen und Bei Methodensignaturen ist Folgendes zu beachten:

  • Verwenden Sie wenn die Methode die Übergabe eines Supertyps von T erfordert.
  • Verwenden Sie wenn die Methode eine genaue Typübereinstimmung für T erfordert.

Durch Befolgen dieser Empfehlungen können Sie Kompilierungsfehler vermeiden und die Typsicherheit bei der Verwendung von Java-Generika gewährleisten.

Das obige ist der detaillierte Inhalt vonWarum kann die Methode „assertThat' nicht kompiliert werden, wenn „Map' verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn