L'appel d'une méthode statique à l'aide de type générique
Aucun membre statique pouvez utiliser un paramètre de type, mais est-il possible d'appeler un membre statique à l'aide du paramètre de type générique? Par exemple:-
abstract class Agent<A>{
void callAgent();
Agent(){
A.add();
}
}
Ici add() est une méthode statique.
Il y a quelques C# de questions et de réponses sur un sujet similaire mais je ne sais pas trop comment le faire en Java.
OriginalL'auteur aps | 2011-06-28
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas le faire si A est un type générique. (Bozho répondit rapidement 🙂 et probablement pensé était Un type concret.
Ce que sera le travail est le suivant.
mais ce n'est probablement pas ce que vous voulez faire.
Après lecture de vos commentaires, il semble que vous voulez vraiment, c'est:
Vos sous-classes devront remplacer
createNew()
.Si vous n'aimez pas que vous pouvez jeter un oeil à AspectJ qui vous permettra de faire de certains constructeur de la magie (voir comment le printemps n' @Configurable) mais qui devient beaucoup plus difficile et complique les choses.
Une autre option est de Scala. Java ne permet pas de faire de l'héritage de méthodes statiques de sorte que vous ne pouvez pas obtenir paramétrée modules (groupes de fonctions dans certaines langues, ce qui est appelé un foncteur ... ocaml). Cependant Scala prend en charge un singleton "objet" qui ne permettent paramétrique fonctionnelle polymorphisme d'héritage.
Pourquoi avez-vous besoin de créer une nouvelle instance d'Un appel à une méthode statique ?
Parce que l'Un n'est pas vraiment une Classe et dans ce cas, la méthode "ajouter" n'est pas une méthode statique. 'A' est un "Type" ou, en d'autres termes un espace réservé. En Java "Types" ne peut pas avoir des méthodes statiques, les méthodes d'instance, ou même des constructeurs. Les Instances de Types peuvent avoir des méthodes mais des cas (c'est à dire new Object()) n'ont pas de méthodes statiques. En Java, seules les Classes peuvent avoir des méthodes statiques.
OriginalL'auteur Adam Gent
Non, vous ne pouvez pas. Le compilateur ne sait pas
A
(qui décide deObject
) a la méthode add.Et vous ne devriez pas besoin d'invoquer des méthodes statiques sur les types génériques en premier lieu. Si vous souhaitez un comportement spécifique de chaque type, de la définir comme non-statique, l'utilisation
extends BaseClass
dans les génériques de la déclaration, et à l'appeler.Techniquement, vous pouvez également appeler une méthode statique de cette façon, mais c'est moche:
Gent - merci, fixe.
hey qu'est-ce que getInstanceOfA(); ? Si vous pouvez réellement créer de nouvelles instances de paramètres de type générique d'une classe générique? Veuillez expliquer.
Non, vous ne pouvez pas. C'est pourquoi je suppose que vous en avez un. Vérifiez bien que ma mise à jour
merci...en fait j'ai l'intention de créer une instance du type générique dans la méthode add de lui-même, car les nouveaux ne peuvent pas être utilisés dans la classe générique. C'est pourquoi je voulais qu'il soit statique. Avez-vous une meilleure façon?
OriginalL'auteur Bozho
Ce n'est pas possible parce que le
A
type ne contient pas nécessairement uneadd()
méthode. Le compilateur ne le permettent pas, car il ne peut pas garantir qu'il fonctionnera.OriginalL'auteur Marcelo
En fait, vous peut appeler une méthode statique sur un paramètre de type (bien qu'il n'est pas fait de façon dynamique).
Essayez ceci:
Je n'ai aucune idée de pourquoi la langue de créateurs ont décidé que c'était une bonne idée pour permettre cela.
OriginalL'auteur Paul Boddington
Il est très pratique pour obtenir une valeur à partir d'un enum vous ne savez pas à l'avance.
Avoir:
Que vous pouvez faire:
Je suppose que vous pouvez prendre avantage de cela dans vos propres classes, bien que je vous déconseille d'utiliser
static
trop.OriginalL'auteur Ferran Maylinch
Vous pouvez utiliser la réflexion pour l'appel de méthode statique de la classe de T. Par exemple:
Mais je peux obtenir de l'exception. Être prudent.
OriginalL'auteur Alex