对于普通(非泛型)方法,子方法需要与父方法的擦除具有等价性即可。
但是对于泛型方法,子方法需要有相同的类型参数,这意味着每个参数必须有相同的绑定,例如:
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,里面并没有规定范型方法覆盖需要检查参数的绑定?所以我想问下这是什么考虑?
Map 跟 Map<String, Integer> 不是父子类型,后者是类型安全的,前者不能保证,泛型在编译时会进行类型校验,运行期擦除。