2015-01-18 10 views
5

Ich habe eine abstrakte Klasse, die einen Konstruktor hat, der varargs akzeptiert. Der Java-Compiler scheint nicht zu verlangen, dass untergeordnete Klassen super() aufrufen, obwohl jeder Konstruktor Argumente annimmt.Java: Wie man Unterklassen fordert, um super() aufzurufen, wenn das Argument von super ein vararg ist

public abstract class Parent { 
    public Parent(String... varargs) { 

    } 
} 

public class Child extends Parent { 
    // I would like this to be a compile error. Child should always call super(). 
} 

Wie kann ich schreiben Parent so dass die Kinder super() nennen müssen?

+0

Das ist, weil Kind abstrakt ist – JClassic

+0

Jede Klasse, die Kind erweitert, muss einen Konstruktor haben, der Super() ruft – JClassic

+0

Das abstrakte Schlüsselwort auf Child war ein Tippfehler - der Code kompiliert ohne es. – Sam

Antwort

4

Der Zweck einer Varargs-Methode besteht darin, dem Programmierer zu ermöglichen, jedes Argument einzeln zu schreiben, sodass ein erforderliches Argument desselben Typs voranzustellen ist, um sicherzustellen, dass mindestens einer übergeben wird. Für Anrufer, die eine Liste oder haben Array kann ein alternativer Konstruktor Iterable akzeptieren.

public abstract class Parent2 { 
    public Parent2(String firstArg, String... varargs) { 

    } 

    public Parent2(Iterable<? extends String> args) { 

    } 
} 

public class Child2 extends Parent2 { 
    public Child2() { 
     super("abc"); 
    } 
} 
+1

Dies beantwortet nicht wirklich Ihre Frage ** wie geschrieben **. Was Sie tatsächlich getan haben, ist die Signatur des Superklassen-Konstruktors von "Null oder mehr Args" zu "einem oder mehreren Argumenten" zu ändern. –

3

Vom docs, die Anzahl der Parameter auf ein Verfahren/Konstruktor übergeben einen varargs Parameter zu akzeptieren, kann auch keine, so dass der Konstruktor wirken als ein Standardparameter weniger Konstruktor sein.

varargs zu verwenden, können Sie den Typ des letzten Parameters durch eine Ellipsen folgen (drei Punkten, ...), dann ein Leerzeichen und die Parameternamen. Die Methode kann dann mit einer beliebigen Anzahl dieses Parameters aufgerufen werden, einschließlich keine.

So könnte man es auf ein Array ändern,

abstract class Parent { 
    public Parent(String[] varargs) { 

    } 
} 

Ihr Kindkonstruktors gezwungen sein würde, ausdrücklich diesen Konstruktor aufrufen.

Verwandte Themen