2017-03-07 1 views
2

Ich experimentiere mit Eclipse null annotations und bekomme einen Fehler. Ich habe eine Klasse A (Beispiel unten), von der ich die Quelle nicht habe. Ich möchte es für eine Klasse erweitern, die von @NonNullByDefault kommentiert wird. Dies führt zu einem Fehler, da die @NonNull-Einschränkung nicht mit den Parametern der Elternklasse übereinstimmt, deren Parameter nicht eingeschränkt sind (Nullable als geerbt).Kann ich @NonNullByDefault nicht mit geerbten Klassen mischen, die keine Null-Annotationsbeschränkung haben?

Eclipse empfiehlt das Hinzufügen @Nullable, aber das macht den Fehler nicht weg.

Mache ich etwas falsch?

Klasse A:

public class A { 
    public void SomeMethod(
     String[] a) 
    { 

    } 
} 

Klasse B:

@NonNullByDefault 
public class B extends A { 
    @Override 
    public void SomeMethod(
     @Nullable String[] a) 
    { 

    } 
} 

Der Fehler I erhalten ist:

Illegal Neudefinition der Parameter a, geerbte Methode von A nicht constrain Dieser Parameter

+0

Duplizieren von https://bugs.eclipse.org/513209, die in der Notwendigkeit einer Antwort, bevor wir entscheiden können, ob es ein Fehler ist oder arbeitet als entworfen . –

+0

Ich habe die Frage hier geschrieben, bevor ich entschieden habe, dass ich es für einen Fehler hielt. Es stellt sich heraus, dass es sich um einen Fehler bei der QuickFix-Funktion von Eclipse handelt, bei dem die "@ Nullable" an der falschen Stelle platziert wurde. Ich werde jetzt eine richtige Antwort auf diese Frage schreiben. – Zhro

Antwort

1

Es ist möglich, @NonNullByDefault mit geerbten, unbeschränkten Klassen zu verwenden, aber eine explizite -Einschränkung muss auf Methodenparameter einer beliebigen Methode angewendet werden, die überschrieben wird. Dies liegt daran, dass das standardmäßige, uneingeschränkte Verhalten für Java Nullen zulässt.

Die Verwirrung hier ist das Ergebnis einer falschen Platzierung der @Nullable Annotation. Die Platzierung in der ursprünglichen Frage schlägt vor, dass das Array Inhalt sollte nicht null sein, anstatt das Array selbst.

Es gibt einen Fehler, aber es ist nicht mit der Anmerkung; Es ist ein Ergebnis von Eclipse (ab 4.6), dass die Annotation mit der Quick Fix-Funktion an der falschen Stelle platziert wird, wodurch eine fehlerhafte Platzierung verstärkt wird, die den Fehler nicht korrigiert.

Die richtige Platzierung für Arrays ist:

public void SomeMethod(
    String @Nullable[] a) 
{ 

} 
Verwandte Themen