Java 为什么重写泛型方法需要相同的边界?
对于普通(非泛型)方法,要求子方法的重写等效于父方法的擦除 但是对于泛型方法,子方法必须具有相同类型的参数,这意味着对于每个参数都具有相同的边界,例如:Java 为什么重写泛型方法需要相同的边界?,java,jls,Java,Jls,对于普通(非泛型)方法,要求子方法的重写等效于父方法的擦除 但是对于泛型方法,子方法必须具有相同类型的参数,这意味着对于每个参数都具有相同的边界,例如: public abstract class Parent { public abstract <T> T example( Map<String, Integer> map) throws Exception; } public class Son1 extends Parent { // this could
public abstract class Parent {
public abstract <T> T example( Map<String, Integer> map) throws Exception;
}
public class Son1 extends Parent {
// this could work
@Override
public <T> T example(Map<String, Integer> map) throws Exception {
return null;
}
}
public class Son2 extends Parent {
// and this couldn't work
@Override
public <T> T example(Map map) throws Exception {
return null;
}
}
public class Son3 extends Parent {
// and this could work
@Override
public Object example(Map map) throws Exception {
return null;
}
}
公共抽象类父类{
公共抽象T示例(Map)抛出异常;
}
公共类Son1扩展了父类{
//这可能行得通
@凌驾
公共T示例(映射)引发异常{
返回null;
}
}
公共类Son2扩展了父类{
//这是行不通的
@凌驾
公共T示例(映射)引发异常{
返回null;
}
}
公共类Son3扩展了父类{
//这可能奏效
@凌驾
公共对象示例(映射)引发异常{
返回null;
}
}
我可以找到这张支票在哪里完成()
为什么Son2不工作?JLS中是否有任何描述?父级的T示例(映射图)
是T示例(映射图)
Son2
的T示例(映射图)
的签名与父的T示例(映射图)
的签名的擦除相同。这使得这两个签名是“的”
“为什么Son2不工作?”
Son2
不起作用,因为它的覆盖等价于父项
“JLS中是否有任何描述?”
是的,有
在一个类中声明两个具有重写等效签名的方法是编译时错误。
示例8.4.2-1.覆盖等效签名
此程序导致编译时错误,因为它声明了两个具有相同(因此重写等效)签名的move
方法。即使其中一个声明是abstract
,这也是一个错误
不,用参数类型为Map
的方法覆盖参数类型为Map
的方法始终是个问题-它总是会导致“原始类型”。原始类型仅用于与Java 1.5之前的代码向后兼容。在方法中将原始类型与泛型类型参数相结合,如public T示例中所示(Map Map)
毫无意义(因为原始类型只存在于不理解泛型的代码中),因此被拒绝。@ErwinBolwidt Son3的情况是为了向后兼容,在JLS中已经描述过。但我不明白为什么Son2不能工作,而Son1可以在JLS中工作。这就是问题所在。
class Point {
int x, y;
abstract void move(int dx, int dy);
void move(int dx, int dy) { x += dx; y += dy; }
}