为什么泛型方法覆盖范型方法需要参数的范型绑定完全一致(而不是擦除后参数一致)?

对于普通(非泛型)方法,子方法需要与父方法的擦除具有等价性即可。

但是对于泛型方法,子方法需要有相同的类型参数,这意味着每个参数必须有相同的绑定,例如:

public abstract class Parent {
    public abstract <T> T example( Map<String, Integer> map) throws Exception;
}
public class Son1 extends Parent {
// 这个能工作,范型需要相同的绑定
    @Override
    public <T> T example(Map<String, Integer> map) throws Exception {
        return null;
    }
}

public class Son2 extends Parent {
// 这个不能工作,参数的绑定不一样
    @Override
    public <T> T example(Map map) throws Exception {
        return null;
    }
}
public class Son3 extends Parent {
// 这个能工作,对于非范型方法,只要求擦除后一样就可以
    @Override
    public Object example(Map map) throws Exception {
        return null;
    }
}

我能找到javac是在哪儿做的这个检查

但是我看了JLS,里面并没有规定范型方法覆盖需要检查参数的绑定?所以我想问下这是什么考虑?

阅读 223
评论
    1 个回答

    Map 跟 Map<String, Integer> 不是父子类型,后者是类型安全的,前者不能保证,泛型在编译时会进行类型校验,运行期擦除。

      撰写回答

      登录后参与交流、获取后续更新提醒