java - Java通用问号和继承
问题描述
四种方法:
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 无法编译,因为它有一个 parameter List<?>
,这意味着任何列表都可以作为参数发送,但它不能被编辑,因为可能会发送 aList<String>
并尝试将 an 添加Integer
到该列表中。
3 - 如果返回类型相同或子类型,则可以覆盖方法,并且Class<?>
与Class
返回类型相同,因为它们都返回 Class 对象,并且Class
可以将任何对象类型转换为Class<?>
,反之亦然
推荐阅读
- javascript - 在 vue 可拖动的每次更改后获取数组 ID
- html - 为什么“价格和时间”表头没有完全覆盖该部门
- java - 序列化和反序列化属性不一致
- flutter - Flutter:当路由被压入堆栈时如何自动触发函数?
- python - 如何从 es.search 结果中的列表中获取搜索到的字符串?
- python - 从 s3 Bucket 获取数据
- php - 如何使用 HTML 动态获取 MailChimp 或 Mandrill 取消订阅 URL?
- c - C 语言中的“diff”Linux 实用程序实现
- python - 您可以将未解析的参数传递给python中的类函数吗?
- java - 放心多部分需要参数顺序