2017-06-22 1 views
1

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.

+0

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) –

Antwort

0

Geschachtelte Platzhalter können zu unerwarteten Inkompatibilitäten führen. Versuchen Sie folgendes:

public String buildMessageForViolations(Set<ConstraintViolation> constraintViolations) {..} 

den Compiler Dies sagt, dass es eine Reihe von ConstraintViolation jeglicher Art nimmt:

public String buildMessageForViolations(Set<? extends ConstraintViolation<?>> constraintViolations) { 
0

ich die Methode als schreiben würde. Ich denke in diesem Fall ist das, was Sie dem Compiler zu sagen versuchen.

Mit Client-Code wie:

ConstraintViolation cv = new StringConstraintViolation(); 
USLValidator uslValidator = new USLValidator(); 

Set<ConstraintViolation> constraintViolationSet = new HashSet<>(); 
constraintViolationSet.add(cv); 
uslValidator.buildMessageForViolations(constraintViolationSet); 
+0

Das wäre fast nett, aber das funktioniert nicht wirklich. Dies führt zu einem Kompilierungsfehler beim Client-Aufruf. –

+0

Wie sieht Ihr Clientcode aus? – Mustafa

+0

Es ist in der ursprünglichen Post, direkt nach "Und änderte dann den Client-Code:". –

Verwandte Themen