Ошибка стирания Java с несвязанным общим методом

Я прочитал другие вопросы, связанные с стираниями, но до сих пор неясно, почему я получаю ошибку компиляции в классе ниже. Другие вопросы включают методы, которые фактически используют общий тип, тогда как я просто пытаюсь реализовать метод, используя ту же самую подпись. Может кто-нибудь объяснить?

Ошибка компиляции → name collash: bar (java.util.Set) в test.Baz и bar (java.util.Set) в test.Foo имеют одно и то же стирание, но не переопределяют другие

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) {}
  }
}

Ответ 1

Вы намерены для Baz реализовать Foo<String> или реализовать Foo<T> или реализовать Foo? То, что вы набрали, было последним из них, но это означает, что Bar реализует "неогенерированный" 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) {}
}

В зависимости от того, что вы пытаетесь сделать.

Ответ 2

Думаю, вам нужно изменить это:

public abstract class Baz implements Foo {

:

public abstract class Baz implements Foo<T> {

Таким образом вы должным образом переопределите функцию Foo.