Java 如何在接口中使返回类型通用?

Java 如何在接口中使返回类型通用?,java,generics,Java,Generics,有三个Java 1.6接口相互继承: interface First<T extends First<T>> { T me(); } interface Second<T extends Second<T>> extends First<T> { } interface Third<T extends Third<T>> extends Second<T> { void foo(); } 编

有三个Java 1.6接口相互继承:

interface First<T extends First<T>> {
  T me();
}
interface Second<T extends Second<T>> extends First<T> {
}
interface Third<T extends Third<T>> extends Second<T> {
  void foo();
}
编译器说
t.me()
的类型是
Second
。我做错了什么?

试试这个:

public <T extends Third<T>> void bar(Third<T> t) {
    t.me().foo();
}
公共空白条(第三个t){
t、 我().foo();
}

问题在于您没有在t的声明中提供类型参数,这使它成为原始类型。因此,所有关于泛型的推理都是无效的。因为me()被声明为在一个使用T extends First参数化的类中返回类型T,所以它的原始类型是First,即使它来自第三个扩展,编译器也会将其视为First

如果要向t-提供任何值的参数编译器将能够使用有关泛型的规则,并且可以计算出me()返回第三个泛型。例如,按照奥利的建议编写一些类Foo可以做到这一点,将其绑定到?也可以做到这一点


如果您将第三个实例作为原始类型的变量,请将其分配给第三个类型的变量。这是合法的,永远不会被取消选中,它将使您达到我认为您需要的位置。

当我尝试它时,编译器似乎认为t.me()是第一种类型@汤姆更糟。你知道如何让编译器认为
t.me()
是第三种类型的
Third
?正如碧昂斯·诺尔斯所说(稍加解释),如果你想使用它,你应该在它上面加上一个类型参数。你能不能再复习一下我的问题,我在最后做了一个更正。我无法控制
t
实例化。对我来说,这是第三种类型。
public <T extends Third<T>> void bar(Third<T> t) {
    t.me().foo();
}