以下Java代码无法编译时出现错误:名称冲突。
class Test {
public void f(Class<?> c) {
}
public void f(Class c) {
}
}
Java中的void f(Class c)
和void f(Class<?> c)
之间有什么区别吗?
答案 0 :(得分:4)
在同一个类中声明,它们是覆盖等效的,并且会导致编译错误。
在类中声明具有覆盖等效签名的两个方法是编译时错误。
其中
如果是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<?>
是所有类型集合的超类型。