java - 为什么在类与方法级别声明 Java 通用类型通过编译
问题描述
注意:这个问题可能看起来类似于 Java 泛型方法继承和覆盖规则,但我感兴趣的是为什么在类级别声明类型参数会导致编译通过。
在下面的代码中,StringMaker2 在实现时编译成功Maker2<String>
但是,StringMaker1 在实现 Maker1 时编译失败:
GenericsTest.java: name clash: make(java.lang.Class<java.lang.String>) in GenericsTest.StringMaker1 and
<T>make(java.lang.Class<T>) in GenericsTest.Maker1 have the same erasure, yet neither overrides the other
Maker1 和 Maker2 的唯一区别是类型参数 ,<T>
前者定义在方法级别,后者定义在类级别。
有人可以解释为什么这会有所不同吗?
public class GenericsTest {
interface Maker1 {
<T> T make(Class<T> type) throws Exception;
}
interface Maker2<T> {
T make(Class<T> type) throws Exception;
}
// This class fails compilation
class StringMaker1 implements Maker1 {
@Override
public String make(Class<String> type) throws Exception {
return type.newInstance();
}
}
class StringMaker2 implements Maker2<String> {
@Override
public String make(Class<String> type) throws Exception {
return type.newInstance();
}
}
}
解决方案
推荐阅读
- angular - 如何合并使用 FROM 创建的 observables 数组的所有映射
- java - 使用 asList() 方法时出现编译器错误
- python - 从 groupby 对象中过滤所有行
- rust - 通过本地生命周期来满足特征
- r - 如何让 org-mode 导出宽或长表以便在 PDF 中可读?
- javascript - 在 chrome 扩展中从 api 获取数据的问题
- arrays - 从Ruby中的排序获取数组索引
- java - 如何在 AEM 中获取集合中的所有资产?
- javascript - 类型错误:elem.addEventListener 不是函数
- java - 如果输入文件末尾没有空行,Java 会报错