Quelle est la manière correcte de renvoyer un Void
type, quand ce n'est pas une primitive? Par exemple. J'utilise actuellement null comme ci-dessous.
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
java
generics
return-value
Robert
la source
la source
Réponses:
Donc, l'une des choses suivantes suffirait:
Object
et retournew Object()
ounull
Void
et retournull
NullObject
de vosVous ne pouvez pas utiliser cette méthode
void
, et tout le reste renvoie quelque chose . Puisque ce quelque chose est ignoré, vous pouvez renvoyer n'importe quoi.la source
return (Void)null;
Java 8 a introduit une nouvelle classe
Optional<T>
, qui peut être utilisée dans de tels cas. Pour l'utiliser, vous modifierez légèrement votre code comme suit:Cela vous permet de vous assurer que vous toujours obtenez une valeur de retour non nulle de votre méthode, même s'il n'y a rien à retourner. C'est particulièrement puissant lorsqu'il est utilisé en conjonction avec des outils qui détectent quand
null
peut ou ne peut pas être retourné, par exemple l'Eclipse@NonNull
et les@Nullable
annotations.la source
Optional<Void>
n'est pas nécessaire pour la même raison que vous donnez, vous obtenez toujours unOptional<Void>
qui est vide et donc toutes les autres méthodes sont inutiles. C'est le contraire de la raison pour laquelle une valeur facultative doit être utilisée. Vous l'utilisez parce qu'il peut avoir ou non une valeur. De plus, le compilateur ne peut pas appliquer ce qui l'method()
implémente correctement. Ce serait un échec à l' exécution:return Optional.of(null)
.Si vous n'avez simplement besoin de rien comme type, vous pouvez utiliser void. Cela peut être utilisé pour implémenter des fonctions ou des actions. Vous pouvez alors faire quelque chose comme ceci:
Ou vous pouvez omettre la classe abstraite et effectuer le retour null dans chaque action qui ne nécessite pas de valeur de retour vous-même.
Vous pouvez ensuite utiliser ces actions comme ceci:
Étant donné une méthode
tu peux l'appeler comme
ou, pour l'action d'annulation (notez que vous n'attribuez le résultat à rien)
la source
Juste pour le plaisir, il y a bien sûr la possibilité de créer une
Void
instance en utilisant la réflexion:Vous ne ferez probablement pas cela en production.
la source
Il n'y a pas de type générique qui dira au compilateur qu'une méthode ne renvoie rien.
Je crois que la convention est d'utiliser Object lors de l'héritage en tant que paramètre de type
OU
Propagez le paramètre de type vers le haut, puis laissez les utilisateurs de votre classe instancier en utilisant Object et en affectant l'objet à une variable tapée à l'aide d'un caractère générique de type
?
:la source
A<?>
ne pourra pas utiliser la valeur renvoyée demethod()
.