如何在界面中使返回类型通用?

时间:2011-04-17 12:22:06

标签: 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();
}

现在我期待这个工作,但不是:

// somewhere later
public void bar(Third t) {
  t.me().foo();
}

编译器说t.me()的类型为Second。我做错了什么?

2 个答案:

答案 0 :(得分:1)

请改为尝试:

public <T extends Third<T>> void bar(Third<T> t) {
    t.me().foo();
}

答案 1 :(得分:1)

问题是你没有在t的声明中提供一个类型参数,这使它成为一个原始类型。因此,围绕仿制药的所有推理都无法发挥作用。因为me()被声明为在使用T extends First参数化的类中返回类型T,所以它的原始类型是First,即使它来自第三个,编译器也会将其视为一个。

如果您要为t - 提供任何值的参数! - 编译器可以使用有关泛型的规则,并且可以解决me()返回第三个问题。例如,写一些类Foo作为Oli建议会这样做,就像将它绑定到?。

如果您将Third的实例作为原始类型的变量,请将其分配给Third类型的变量。这是合法的,从不加以控制,并且会让你到达我认为你需要的地方。