59 votes

Quelle est la différence entre Void et no parameter ?

J'ai une classe qui définit deux méthodes surchargées.

public void handle(Void e) 

protected void handle() 

Ils sont évidemment différents, surtout handle(Void e) est public .

Quelle est la différence entre ces deux-là ?

Comment appeler la première méthode ? J'utilise handle(null) - Est-ce correct ?

66voto

Bohemian Points 134107

Void est une classe spéciale habituellement utilisée uniquement pour la réflexion - son utilisation principale est de représenter le type de retour d'une méthode void. De la javadoc pour Void :

La classe Void est une classe de remplacement non substantielle qui contient une référence à l'objet Class représentant le mot-clé Java void.

Parce que le Void ne peut pas être instanciée, la seule valeur que vous pouvez transmettre à une méthode avec une classe Void paramètre de type, tel que handle(Void e) c'est null .

C'est la version officielle des événements, mais pour ceux qui sont intéressés, en dépit des affirmations contraires dans la javadoc de l'application Void vous peut instancie réellement une instance de Void :

Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor!

Cela dit, j'ai vu Void "utilement" utilisé comme un type de paramètre générique lorsque vous voulez indiquer que le type est "ignoré", par exemple :

Callable<Void> ignoreResult = new Callable<Void> () {
    public Void call() throws Exception {
        // do something
        return null; // only possible value for a Void type
    }
}

Callable Le paramètre générique de l'outil est le type de retour, donc lorsque l'outil Void est utilisé de cette manière, c'est un signal clair pour les lecteurs du code que la valeur renvoyée n'est pas importante, même si l'utilisation de la balise Callable est nécessaire, par exemple si l'on utilise l'interface Executor cadre.

42voto

Confusion Points 6056

La première fonction est une fonction d'un seul argument, qui doit être fourni et ne peut valablement prendre que la valeur null . Toute valeur autre que null ne sera pas compilée. La deuxième fonction ne prend pas d'argument et le passage de la fonction null ne compilerait pas.

Cela répond-il à votre question ?

15voto

Raffaele Points 10209

Considérez l'API comme AsyncTask<T1, T2, T3> de le système Android qui fournit trois crochets :

class AsyncTask<S, T, V> {
  void doInBackground(S...);
  void onProgressUpdate(T...);
  void onPostExecute(V);
}

Lorsque vous étendez le type générique AsyncTask<T1, T2, T3> il se peut que vous ne soyez pas intéressé par l'utilisation de paramètres pour l'option progrès et résultat de sorte que votre mise en œuvre ressemblera à ceci :

class HTTPDownloader extends AsyncTask<URL, Void, Void> {
  void doInBackground(URL... urls) {}
  void onProgressUpdate(Void... unused) {}
  void onPostExecute(Void unused) {}
}

et vous pouvez invoquer ces méthodes avec un null puisque Void ne peut pas être instancié.

6voto

Marko Topolnik Points 77257

Si Void n'est pas en fait une instanciation d'un paramètre de type (où cela a évidemment du sens), il y a également du sens à déclarer un paramètre de type handle(Void) si votre handle est soumise à un contrat extralinguistique qui stipule que l'objet qui veut participer à un certain protocole doit mettre en œuvre une méthode de type méthode de poignée à un argument indépendamment du type d'argument réel. Maintenant, il peut y avoir un cas spécial de mise en œuvre qui ne peut pas gérer autre chose que null il est donc logique de déclarer handle(Void) pour une telle mise en œuvre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X