用Java中的方法覆盖查询泛型

时间:2016-04-09 12:44:45

标签: java generics method-overriding

案例 - 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的角度来看彼此相反。

任何指针都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

请参阅JLS中的this section

  

在类C中声明或继承的实例方法mC,覆盖在接口I中声明的另一个方法mI,iff以下所有条件都为真:

     
      
  • 我是C的超级接口。
  •   
  • mIabstract或默认方法。
  •   
  • mC的签名是mI签名的子签名(第8.4.2节)。
  •   

关注this section

  

方法m1的签名是方法m2的签名的子签名,如果是:

     
      
  • m2m1

  • 具有相同的签名   
  • m1的签名与m2签名的删除(§4.6)相同。

  •   

使用类型擦除时,方法签名没有类型变量:

  

删除泛型方法的签名没有类型参数。