1

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

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

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,里面并没有规定范型方法覆盖需要检查参数的绑定?所以我想问下这是什么考虑?

Robert_Lu 484
12月5日提问
1 个回答
0

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

撰写答案

推广链接