Java泛型问号和继承

标签 java generics

四种方法:

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/

相关文章:

c# - 通用类型用作更具体的通用类型

java - 用解释型编程语言实现功能

java - 如何在代码中使用paint方法显示按钮?

java - 信号量和 Java 计数

c# - 从泛型类实现的接口(interface)调用泛型类中的泛型属性

Scala 从 DSL 到函数的自然转换

java - 用于 Apache Cassandra 安装的 DataStax Bulk Loader 1.7.0 在 Ubuntu 上无法运行

java - Jar 文件无法在 SWT Mac 上运行

generics - 实现数字

generics - 为什么 Rust 不能将带有生命周期参数的异步函数强制转换为函数指针?