Java擦除错误与方法中不相关的泛型

时间:2009-06-01 18:02:49

标签: java generics

我已经阅读了与删除相关的其他问题,但我仍然不清楚为什么我在下面的课程中遇到编译错误。其他问题涉及实际使用泛型类型的方法,而我只是尝试使用完全相同的签名来实现方法。谁能解释一下?

编译错误 - >名称冲突:test.Baz中的bar(java.util.Set)和test.Foo中的bar(java.util.Set)具有相同的擦除,但都没有覆盖其他

import java.util.Set;

public class test {
  public interface Foo<T> {
    public void bar(Set<String> s);
  }

  public abstract class Baz implements Foo {
    public void bar(Set<String> s) {}
  }
}

2 个答案:

答案 0 :(得分:15)

您是否打算让Baz实施Foo<String>或实施Foo<T>或实施Foo?你输入的是最后一个,但这意味着Bar实现了“ungenerified”Foo。奇怪的是,这完全取消了Foo定义中的泛型,而不仅仅是与T有关的泛型。

这意味着在Baz内,方法Foo.bar的参数仅为Set,而不是Set<String>

你想要:

public abstract class Baz implements Foo {
  public void bar(Set s) {}
}

public abstract class Baz<T> implements Foo<T> {
  public void bar(Set<String> s) {}
}

public abstract class Baz implements Foo<Void> {
  public void bar(Set<String> s) {}
}

取决于你想要做什么。

答案 1 :(得分:4)

我认为你需要改变这个:

public abstract class Baz implements Foo {

到此:

public abstract class Baz implements Foo<T> {

这样你就可以正确覆盖函数Foo