首页 > 解决方案 > 为什么在类与方法级别声明 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();
        }
    }
}

标签: javagenericscompilation

解决方案


推荐阅读