在实现泛型方法时,返回值类型有所不同。

11 浏览
0 Comments

在实现泛型方法时,返回值类型有所不同。

今天我偶然发现了一些我甚至都没想到能够编译的Java代码。将其简化到最简形式,如下所示:

import java.util.List;
interface A {
     List foo();
}
interface B {
     List foo();
}
class C implements A, B {
    @Override
    public List foo()
    {
        return null;
    }
}

乍一看,接口A和B中的foo方法的类型参数似乎是不必要的,因为T在其他地方都没有被使用。不管怎样,我发现这在允许冲突的返回值类型在同一实现中共存方面起着至关重要的作用:如果省略一个或两个,代码就无法编译。下面是不起作用的版本:

import java.util.List;
interface A {
    List foo();
}
interface B {
    List foo();
}
class C implements A, B {
    @Override
    public List foo()
    {
        return null;
    }
}

我不需要修复上面的代码片段,因为那些只是我编造的例子来解释我的观点。我只是好奇为什么编译器在处理它们时会有所不同。请问有人可以解释一下在这里起作用的精确规则是什么吗?

0