四种方法:
public Class<?> Func(Class<?> cls) //1
public Class<?> Func(Class cls) //2
public Class Func(Class<?> cls) //3
public Class Func(Class cls) //4
我发现:
1) 4 可以覆盖 3
2) 3 不能覆盖 4。
3)但是2和4可以互相覆盖。
这可能与类型转换无关,因为 Class 和 Class<> 可以相互转换。这更多地说明了为什么编译器阻止 (2) 但允许 (1) 和 (3)。
最佳答案
原因 -
1 - Class
意味着任何类型的Class
对象,即 Class<?>
.
2 - 具有 Class<?>
的功能参数无法编辑Class<?>
的对象类型,但是具有 Class
的函数参数即可。
例如 -
// function 1
void m(List<?> list){
list.add(3);
}
// function 2
void m(List<?> list){
list.get(0);
}
函数 1 无法编译,因为它有一个参数 List<?>
,这意味着任何列表都可以作为参数发送,但无法编辑,因为可能会发送 List<String>
并尝试添加 Integer
到该列表。
3 - 如果返回类型相同或为子类型,则可以重写方法,并且 Class<?>
和Class
与返回类型相同,因为它们都返回 Class 对象,并且任何 Class
对象可以类型转换为 Class<?>
或反之亦然
关于Java泛型问号和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58446360/