Search code examples
javagenericsfinalgeneric-list

Restricting Java generic parameter type to a list of final classes


T is unrestricted in the following declaration.

abstract public class Defaults<T>

However, my Defaults class deals with only String, Integer, Double. Therefore, I would like to restrict T to String, Integer, Double.

Obviously, the following is not allowed as they are finals:

abstract public class Defaults<T extends String&Integer&Double>

How then can I do it?


Solution

  • You cannot. The closest thing you can do is give Defaults a private constructor

    private Defaults() {}
    

    ...and provide factory methods only for the allowed classes:

    public static Defaults<String> stringDefaults() { return new Defaults<>(); }
    public static Defaults<Integer> integerDefaults() { return new Defaults<>(); }
    public static Defaults<Double> doubleDefaults() { return new Defaults<>(); }