具有类型列表和继承的方法

时间:2012-06-28 13:24:56

标签: java list inheritance typed

我遇到了一个带有类型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的方法测试(列表)必须覆盖或实现超类型方法”错误,这不应该发生。

但删除列表的类型有效......虽然它不依赖于类泛型。

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()列表的类型没有影响。有没有人知道发生了什么?

由于

2 个答案:

答案 0 :(得分:8)

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

如果您切换到原始类型,所有泛型将被原始广告替换,无论其类型是否已填写。

要做得好,请执行

 public class A<T> extends B<T>

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

答案 1 :(得分:1)

当你删除使用没有泛型的类(并使用它原始)时,类方法中的所有泛型都会被遗忘。

由于这个原因,当您在第二种情况下通知泛型类型时,您可以使用它。

此:

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

在这种情况下:

class A extends T {
}

将如下所示:

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

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