I'm using generics like this: public class MyList<T>. Is there any way to ensure that the class represented by T implements a certain static method?
            Asked
            
        
        
            Active
            
        
            Viewed 306 times
        
    2
            
            
         
    
    
        ryyst
        
- 9,563
- 18
- 70
- 97
- 
                    @Kirk Woll: I'm trying to avoid having to subclass stuff or having to declare methods non-static that really should be static. At the same time, I want to keep my code as concise as possible using generics. – ryyst Jan 29 '11 at 14:46
- 
                    @user, my point is that even if you *could* add such a constraint, it would be pointless as there is nothing you could do with that ability from within your generic `MyList` in the first place. You would not be able to invoke those static methods from within your generic list -- you cannot do anything with static members via generic parameters. – Kirk Woll Jan 29 '11 at 14:50
- 
                    IMHO, your method should not be static. Even if you need a method returning the same value for each instance and not using `this` at all, it shouldn't be static (which took me once long to comprehend). There are in fact just few uses for static methods. – maaartinus Jan 29 '11 at 14:54
- 
                    @Kirk Woll: Basically, I got some very similar classes. Part of these classes is checking whether a given string matches with the required format. I do that checking with a static method. I'm currently implementing the classes using generics. So I have to somehow check the format. I obviously could make the format-checking method non-static but I'm looking for a more elegant solution. – ryyst Jan 29 '11 at 14:55
- 
                    Why what? Maybe http://stackoverflow.com/questions/3251269/when-to-use-static-classes-and-methods could help? – maaartinus Jan 29 '11 at 15:05
2 Answers
2
            No, even without generics there is never a way to ensure a class implements a static method.
You can, however, create a generic static method.
public static <T> List<T> makeSingletonList(T item) {
      ArrayList<T> result = new ArrayList<T>();
      result.add(item);
      return result;
}
 
    
    
        Pace
        
- 41,875
- 13
- 113
- 156
2
            
            
        Unfortunately not.
As an alternative, consider whether the static methods of your class belongs in some sort of associated class like a builder:
class Person {
    public static Person createFromDatastore(Datastore datastore) { ... }
}
It may be better to move the static to a separate class as a non-static method:
class PersonBuilder implements Builder<Person> {
     public Person createFromDatastore(Datastore datastore) { ... }
}
This means that you can dictate clients of your generic class can now be required to provide it:
public class MyList<B extends Builder<T>, T> ...
 
    