Search code examples
javaclassgeneric-type-argument

what is the purpose of angle brackers in the Java Class constructor?


I want method public void x(List<Class<some expression>> m) to throw an error if you try to pass a class which does not extend class A{} by replacing "some expression" with... some expression.

I always get an annoying warning when I use a wildcard or don't include it, so I would like to understand why Class deserves a dimension at all, even if I'm totally off base as to how it's used.


Solution

  • I don't exactly get what you want to do. Actually, this method signature:

    public void x(List<? extends YourClass> m)
    

    will not compile if you pass a List of objects whose class doesn't extend YourClass (let's call it so, instead of A).

    If you want your x method to get, as a parameter, a list of Class objects, that's another issue. Are you sure you are not willing to just pass a List of objects of a class that extends YourClass? If so, that method signature should work.

    EDIT: Since you stated you want to pass a list of classes, then this should work:

    public void x(List<Class<? extends YourClass>> m)
    

    Tested this way:

    import java.util.*;
    
    class YourClass {}
    class YourClassEx extends YourClass {}
    
    public class Test {
    
        public static void x(List<Class<? extends YourClass>> m) {
            // stuff...
        }
    
        public static void main(String[] argv) {
    
            List<Class<? extends YourClass>> list = new ArrayList<>();
            list.add(YourClass.class);
            list.add(YourClassEx.class);
            x(list); // compiles fine until here
    
            list.add(String.class); // doesn't compile
            x(new ArrayList<Class>()); // doesn't compile, either
    
        }
    }