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

Java擦除错误与方法中不相关的泛型,java,generics,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>

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

编译错误->名称冲突: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) {}
  }
}
import java.util.Set;
公开课考试{
公共接口{
公共空栏(套);
}
公共抽象类Baz实现了Foo{
公共空栏(集合s){}
}
}

我认为您需要更改以下内容:

public abstract class Baz implements Foo {
为此:

public abstract class Baz implements Foo<T> {
公共抽象类Baz实现了Foo{

这样,您就可以正确地重写函数
Foo

您是想让Baz实现
Foo
还是实现
Foo
还是实现
Foo
?您键入的是最后一个,但这意味着Bar实现了“未通用化”奇怪的是,这完全关闭了
Foo
定义中的泛型,而不仅仅是与
T
相关的泛型

这意味着在
Baz
中,方法
Foo.bar
只接受
Set
的参数,而不是
Set

您想要:

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

公共抽象类Baz实现了Foo{
公共空栏(集合s){}
}

公共抽象类Baz实现了Foo{
公共空栏(集合s){}
}

取决于你想做什么。

呵呵,我也想解释一下为什么它是错的……但我真的不知道为什么。:(好吧,在我把我的答案拿进去之前,你在几分钟内就得到了你的答案,所以你抓住了“看看那里的一个答案,如果它是模糊正确的,就投票吧”bump,值从+2到+7,这取决于一天中的问题和时间。(而且你知道你的答案也不会编译,对吧?)Baz是抽象的,所以我打算让具体的子类选择T。你的第二个选择可能是最接近我想要做的。是的,它变成了所有的泛型,而不仅仅是T。这让我很困惑。谢谢。我知道我在挖死人,但有人能告诉我为什么会发生这种情况吗(这就是关闭所有泛型的原因)
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) {}
}