Ich habe eine Methode, wie diese in einer wieder verwendbaren Klasse:Aufruf der Java-Methode mit Set mit verschachteltem "?" generischer Typ
public String buildMessageForViolation(ConstraintViolation<?> constraintViolation) {
return constraintViolation.getPropertyPath().toString().replace(".<collection element>", "") + ": " + constraintViolation.getMessage();
}
aus einer anderen Klasse wie folgt genannt:
fieldValidator.appendErrorMessage(getUslValidator().buildMessageWithProperty(constraintViolations.iterator().next()) +
(constraintViolations.size() > 1 ? ", and other errors" : ""));
Also, da ich diesen Block erwarte in vielen Klassen wiederholt werden Ich wollte das so umgestalten, dass die Komplexität in der wiederverwendbaren Klasse liegt, nicht im Client-Code.
Also, habe ich dann diese auf die wiederverwendbare Klasse:
public String buildMessageForViolations(Set<ConstraintViolation<?>> constraintViolations) {
return buildMessageForViolation(constraintViolations.iterator().next()) +
(constraintViolations.size() > 1 ? ", and other errors" : "");
}
Und änderte dann den Client-Code dazu:
fieldValidator.appendErrorMessage(getUslValidator().buildMessageForViolations(constraintViolations));
Diese nicht kompiliert und sagte:
The method buildMessageForViolations(Set<ConstraintViolation<?>>) in the type USLValidator is not applicable for the arguments (Set<ConstraintViolation<ClientSpecificClassName>>)
Offensichtlich hat dies etwas damit zu tun, dass ich "?" für den geschachtelten Typparameter. Aus meiner Sicht ist dies sinnvoll, da die wiederverwendbare Klasse den Typparameter der ConstraintViolation nicht interessiert.
Gibt es etwas einfaches, was ich tun kann, um dies zu beheben?
aktualisieren:
ich eine Antwort las, die auf diese geschrieben wurde, zusammen mit nachfolgenden Änderungen an der Antwort, aber dann war es aus irgendeinem Grund (erraten, die Responder gelöscht gab es auf, es richtig zu machen).
Während die Antwort immer noch da war, half es mir zumindest, einen einigermaßen vernünftigen Workaround zu finden.
Der Client-Code kann dies stattdessen tun:
fieldValidator.appendErrorMessage(getUslValidator().buildMessageForViolations(new HashSet<ConstraintViolation<?>>(constraintViolations)));
, dass zumindest ein wenig besser als das Original, obwohl es noch einige Textvorschlag, dass die Menschen zu erinnern.
Mögliches Duplikat [nicht zu unspezifisch verschachtelter Art mit Generika gegossen Kann] (https://stackoverflow.com/questions/3575681/cant-cast-to- zu-unspezifisch-verschachtelten-Typ-mit-Generika) –