Methoden null-Argument bei varargs

HimBromBeere

Top Contributor
Malzzeit,

bin gerade über eine Warnung gestolpert, die mir mein liebes Eclipse ausgespuckt hat:
Code:
The argument of type null should explicitly be cast to Attribute[] for the invocation of the varargs constructor VectorLayer(Class<? extends Geometry>, String, Attribute...). It could alternatively be cast to Attribute for a varargs invocation
Was die soll ist mir schon klar, der Compiler würde gern einen Aufruf über
Code:
VectorLayer(Point.class, name, (Attribute[] null))
haben, aber mal ehrlich: das sieht doch nach nichts aus. Hab die Warnung einfach mal ignoriert und festgestellt, dass es auch ohne Cast geht. Und dann hab ich das hier gelesen und micht gewundert, dass man bei
Code:
Class<?> ... param
das
Code:
null
auch weglassen kann. Warum dann nicht auch bei anderen varargs?
 
Zuletzt bearbeitet:
Ja, bei nicht-primitiven varargs ist erstmal nicht klar, ob die 'null' ein Element sein soll, oder der Array.

Aber... einfach keinen Parameter angeben geht eigentlich immer.... :bahnhof:
 
weglassen geht immer,
wenn man aber null übergibt, macht es schon einen wichtigen Unterschied, was für ein null man meint,

es geht auch ohne Cast, aber wenn man nicht weiß welche Variante der Ausführung gewählt wird,
muss man erst aufwendig nachschauen..

Java:
public class Test {
    public static void main(String[] args)  {
        x();
        x(null);
        x((JFrame)null);
        x((JFrame[])null);
    }

    static void x(JFrame... args) {
        System.out.println(Arrays.toString(args));
    }
}
 
Du musst gar kein [c]null[/c] übergeben. Oder willst du ein Array mit einem Eintrag - [c]null[/c] - erhalten? Dann müsstest Du [c](Attribute) null[/c] schreiben.
 
Aber... einfach keinen Parameter angeben geht eigentlich immer....
Leider eben nich. Habe zwei Konstruktoren:
Java:
public VectorLayer(Class<? extends Geometry> geomType, String name) 
throws NotSupportedGeomTypeException  {this(geomType, name, null);}

public VectorLayer(Class<? extends Geometry> geomType, String name, final Attribute ... attributes) 
throws NotSupportedGeomTypeException {
    //...
	// return when no attributes were passed
	if (attributes == null) return;
	// ...add the attributes
}
Wenn ich nun im ersten der beiden das
Code:
null
weglassen, meckert der Compiler rum, weil ich dann einen rekursiven Konstruktoraufruf hätte, der in einer Endlosschleife resultiert.
Achja, der Test auf
Code:
null
wird nur gemacht, damit ich nicht bei
Code:
attributes.length
auf ´ne NPE fliege...

[OT]Ich würde übrugens beim Erreichen der 1000er Marke gerne eine Floppy Disk bleiben, ich find den Namen einfach zu köstlich...[/OT]
 
Wenn ich nun im ersten der beiden das
Code:
null
weglassen, meckert der Compiler rum, weil ich dann einen rekursiven Konstruktoraufruf hätte, der in einer Endlosschleife resultiert.
Achja, der Test auf
Code:
null
wird nur gemacht, damit ich nicht bei
Code:
attributes.length
auf ´ne NPE fliege...

Man darf bei Varargs auch ein Array übergeben: [c]this(geomType, name, new Attribute[]{})[/c]. Aber wenn der Code genau so wie im Beispiel ist, brauchst du den Konstruktor ohne Varargs doch gar nicht.
 

Neue Themen


Zurück
Oben