首页 > 解决方案 > 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)。

标签: javagenerics

解决方案


原因 -
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<?>,反之亦然


推荐阅读