Java中的void f(Class c)和void f(Class <! - ? - > c)之间有什么区别吗?

时间:2015-01-07 02:54:26

标签: java generics methods overloading method-signature

以下Java代码无法编译时出现错误:名称冲突

class Test {

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

    public void f(Class c) {
    }
}

Java中的void f(Class c)和void f(Class<?> c)之间有什么区别吗?

2 个答案:

答案 0 :(得分:4)

在同一个类中声明,它们是覆盖等效的,并且会导致编译错误。

来自Java Language Specification

  

在类中声明具有覆盖等效签名的两个方法是编译时错误。

其中

  

如果是m1,则两个方法签名m1和m2是覆盖等效的   是m2或m2的子签名是m1的子签名。

  

方法m1的签名是方法m2的签名的子签名,如果:

     
      
  • m2与m1具有相同的签名,或
  •   
  • m1的签名与m2签名的删除(§4.6)相同。
  •   

粗体情况是这里的问题。

Class<?>的删除是Class

  

Java中的void f(Class c)和void f(class c)之间有什么区别吗?

从来电者的角度来看,没有。在方法体内,是的。在第一种情况下,参数具有raw type Class。在第二种情况下,参数具有参数化类型Class<?>

答案 1 :(得分:0)

实际上?是一张外卡,可以与参数化类/接口一起使用。例如,Collection<Object>是一个通用集合,其中包含Object类型的项,而Collection<?>是所有类型集合的超类型。