7

我在使用从另一个(类型化)类继承的类型化 List 参数的方法时遇到了一些问题。

让我们保持简单:

public class B<T> {
  public void test(List<Integer> i) {
  }
}

B 类有一个无用的泛型 T,而 test() 需要一个整数列表。

现在如果我这样做:

public class A extends B {
  // don't compile
  @Override
  public void test(List<Integer> i) {
  }
}

我收到“ A 类型的方法 test(List) 必须覆盖或实现超类型方法”错误,这不应该发生。

但是删除列表的类型是可行的……尽管它不依赖于泛型类。

public class A extends B {
  // compile
  @Override
  public void test(List i) {

并且还定义了下面无用的泛型以使用类型列表

public class A extends B<String> {
  // compile
  @Override
  public void test(List<Integer> i) {

所以我一无所知, B 的泛型应该对 test() 列表的类型没有影响。有人知道发生了什么吗?

谢谢

4

2 回答 2

9

您正在扩展 B 的原始类型,而不是通用类型。原始的实际上没有test(List<Integer> i)方法,而是test(List)方法。

如果切换到原始类型,则所有泛型都将替换为原始类型,无论它们的类型是否已填写。

要正确执行,请执行

 public class A<T> extends B<T>

这将使用泛型类型B<T>,其中包括您要覆盖的方法。

于 2012-06-28T13:39:13.863 回答
1

当您删除使用没有泛型的类时(并直接使用它),类方法中的所有泛型都将被遗忘。

由于这个原因,当您在第二种情况下通知泛型类型时,您可以使其正常工作。

这:

class T<G> {
   public void test(G g);
}

在这种情况下:

class A extends T {
}

看起来像这样:

class T {
   public void test(Object g);
}

这是在 Google IO 2011 上展示的 Java 拼图,您可以在此处观看视频

于 2012-06-28T13:37:33.427 回答