2010-09-23 17 views
1

J'ai une affectation qui m'oblige à utiliser le modèle d'usine pour implémenter une structure de données immuable, mais le problème est que la classe abstraite est générique et que les méthodes statiques font référence aux types génériques me pose des problèmes. Ma mission me demande d'utiliser des méthodes statiques, donc je commence à paniquer. Toute aide/suggestion? EDIT a ajouté quelques exemples de code, et est ici le cahier des charges pour l'une des méthodes du professeur nous a donné Signature:Génériques dans les méthodes d'usine statiques? (Java)

ExampleClass.method1: ExampleClass, T -> ExampleClass

ExampleClass.method2: ExampleClass - > T

public abstract class ExampleClass<T>{ 

    //static method creates a new subclass of Example ("Push" method) 
    public static Class method1(T x, ExampleClass c){ 
     return new method1(x, f); 
    } 

    //Supposed to return an object type T ("pop" method) 
    public static T method2(ExampleClass c){ 
     return c.method2Dynamic(); 
    } 

les deux méthodes que j'ai comme celles-ci me donnent des problèmes dans l'éclipse.

+1

un échantillon de code que vous pouvez fournir? –

+0

la question est très vague. Vous devriez écrire ce que vous avez proposé jusqu'à présent et ensuite les gens pourront corriger, suggérer des améliorations à ce sujet, répondant ainsi à votre question. Parce que, comme il est, vous demandez à quelqu'un d'écrire le devoir pour vous –

+0

ajouté un exemple de code pour vous. – BDubs

Répondre

0

Voir le Java tutorial pour obtenir de l'aide sur les méthodes génériques (par opposition aux classes génériques). De votre description à ce jour, la question de la méthode statique par rapport à la méthode d'instance ne devrait pas entrer en ligne de compte.

3

Je ne sais pas ce que vous voulez vraiment faire, mais supposons que le problème est que vous êtes à la recherche de la bonne syntaxe:

public class ExampleClass<T> { 
    public static <T> Class<T> method1(T x, ExampleClass<T> c) { 
     return c.method3(x); 
    } 
    public static <T> T method2(ExampleClass<T> c) { 
     return c.method2Dynamic(); 
    } 
    private Class<T> method3(T x) { 
     return null; 
    } 
    private T method2Dynamic() { 
     return null; 
    } 
} 
0

Si vous avez une classe generified, vous ne pouvez pas utiliser les paramètres de type dans les méthodes statiques, car ils n'ont pas de sens là-bas. Par exemple, considérons ArrayList<T>. Vous pouvez créer un ArrayList<String> stingList = new ArrayList<String>() et un ArrayList<Integer> integerList = new ArrayList<Integer>. Vous devez maintenant utiliser des instances de ArrayList, chacune avec son propre type de paramètre, et des méthodes d'instance qui peuvent tirer parti de ce type de paramètre comme get. Mais les méthodes statiques appartiennent à la classe et non à l'instance, donc quand vous appelez une méthode statique, vous l'appelez ArrayList.staticMethod() PAS stringList.staticMethod() ou integerList.staticMethod() (vous pouvez le faire aussi, mais cela n'a pas vraiment de sens, puisque la méthode statique ne peut pas accéder variables d'instance, donc cela fait exactement la même chose que de l'appeler sur la classe). Mais lorsque vous l'appelez sur la classe, la classe est juste ArrayList, sans aucun paramètre de type, puisque les paramètres de type ne sont utilisés que par les instances.

Vous pouvez cependant avoir des méthodes qui ont leur propre paramètre de type, qui est indépendant du paramètre type de la classe, comme Thomas le montre dans sa réponse. Vous pouvez donc appeler ces méthodes comme ExampleClass.<String> staticMethod(); Notez que ExampleClass n'a pas de paramètre de type ici, mais la méthode l'a. (vous pouvez omettre le <String> dans l'appel de la méthode si le compilateur peut déduire à partir des paramètres utilisés, ou le type de retour: String s = ExampleClass.method2(new ExampleSubclass<String>()), il fait généralement un très bon travail pour déduire)