Heim >Java >javaLernprogramm >Warum kann die Methode „assertThat' nicht kompiliert werden, wenn „Map' verwendet wird?
Java Generics: erweitert T> vs.
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 erweitert T> und
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
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 erweitert T> und
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!