案例 - 1
interface Test{
public void display();
}
public class TestGenerics implements Test{
@Override
public <T> void display() {
System.out.println("done");
}
public static void main(String args[]){
TestGenerics ts = new TestGenerics();
ts.display();
}
}
在Case-1中,接口中的方法没有任何通用数据类型,但TestGenerics类中的overriden方法在方法签名中具有通用数据类型<T>
。这打破了方法规则覆盖与display()的方法签名完全匹配并抛出编译错误。
案例 - 2
interface Test{
public <T> void display();
}
public class TestGenerics implements Test{
@Override
public void display() {
System.out.println("done");
}
public static void main(String args[]){
TestGenerics ts = new TestGenerics();
ts.display();
}
}
Case-2,代码在接口的方法声明中提供的方法覆盖和泛型的概念下工作正常。需要注意的是,TestGenerics类中的Overriden方法未指定泛型类型<T>
。
查询是,为什么编译在Case-1中失败但在Case-2中相反,从Java中的Method Overriding的角度来看彼此相反。
任何指针都将受到赞赏。
答案 0 :(得分:1)
请参阅JLS中的this section:
在类C中声明或继承的实例方法
mC
,覆盖在接口I中声明的另一个方法mI
,iff以下所有条件都为真:
- 我是C的超级接口。
mI
是abstract
或默认方法。mC
的签名是mI
签名的子签名(第8.4.2节)。
关注this section:
方法
m1
的签名是方法m2
的签名的子签名,如果是:
- 具有相同的签名
m2
与m1
,或
m1
的签名与m2
签名的删除(§4.6)相同。
使用类型擦除时,方法签名没有类型变量:
删除泛型方法的签名没有类型参数。