Search code examples
javagenericsmethodsoverloadingmethod-signature

Is there any difference between void f(Class c) and void f(Class<?> c) in Java?


The following Java code cannot be compiled with an error: Names conflict.

class Test {

    public void f(Class<?> c) {
    }

    public void f(Class c) {
    }
}

Is there any difference between void f(Class c) and void f(Class<?> c) in Java?


Solution

  • Declared in the same class, they are override-equivalent and will cause a compilation error.

    From the Java Language Specification

    It is a compile-time error to declare two methods with override-equivalent signatures in a class.

    where

    Two method signatures m1 and m2 are override-equivalent iff either m1 is a subsignature of m2 or m2 is a subsignature of m1.

    and

    The signature of a method m1 is a subsignature of the signature of a method m2 if either:

    • m2 has the same signature as m1, or
    • the signature of m1 is the same as the erasure (§4.6) of the signature of m2.

    The bolded case is the problem here.

    The erasure of Class<?> is Class.

    Is there any difference between void f(Class c) and void f(Class c) in Java?

    From a caller's perspective, no. Within the body of the method, yes. In the first case, the parameter has the raw type Class. In the second case, the parameter has the parameterized type Class<?>.