【问题标题】:Method with typed list and inheritance具有类型列表和继承的方法
【发布时间】:2012-06-28 21:39:13
【问题描述】:

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

谢谢

【问题讨论】:

  • 我相信你的答案在于here
  • 通常 [capital V] Void 用于您不想使用的通用参数。例如使用 java.security.PreivilegedAction 而不返回值(返回 null - 这是唯一有效的 Void 引用)。

标签: java list inheritance typed


【解决方案1】:

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

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

要正确地做,做

 public class A<T> extends B<T>

这将使用泛型类型B&lt;T&gt;,其中包括您要覆盖的方法。

【讨论】:

  • 谢谢。因为我们没有使用 T,所以这不太合乎逻辑,但是 java 的泛型有一些我们必须处理的设计缺陷。
【解决方案2】:

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

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

这个:

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

在这种情况下:

class A extends T {
}

看起来像这样:

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

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

【讨论】:

  • 真正的问题是我没有使用 G 而是一个具体的类。无论如何,我得到了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多