Есть ли разница между void f (Класс c) и void f(класс в) на Java?


Следующий код Java не может быть скомпилирован с ошибкой: конфликт имен .

class Test {

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

    public void f(Class c) {
    }
}

Есть ли какая-либо разница между void f(Class c) и void f(Class<?> c) в Java?

2 2

2 ответа:

, объявленные в том же классе, они эквивалентны переопределению и вызовут ошибку компиляции.

Из спецификации языка Java

Объявление в классе двух методов с сигнатурами, эквивалентными переопределению, является ошибкой времени компиляции.

Где

Две сигнатуры метода m1 и m2 эквивалентны переопределению, Если либо m1 это подподписью м2 или м2 подподписью М1.

И

В сигнатура метода m1 является подсигналом сигнатуры метода m2, Если либо:

  • m2 имеет ту же сигнатуру, что и m1, или
  • подпись m1 такая же, как и стирание (§4.6) подписи m2.

Здесь проблема заключается в полужирном падеже.

Стирание Class<?> равно Class.

Есть ли какая-либо разница между void f(Класс c) и void f(Класс c) в Java?

От абонента перспектива-нет. Внутри тела метода-да. В первом случае параметр имеет вид raw Class. Во втором случае параметр имеет параметризованный тип Class<?>.

На самом деле ? является подстановочной картой, которая может использоваться с параметризованными классами/интерфейсами. Например, Collection<Object> - это универсальная коллекция, содержащая элементы типа Object, тогда как Collection<?> - это супертип всех типов коллекций.