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

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

Ошибка компиляции -> конфликт имен: 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) {}
  }
}

person Brian Deterling    schedule 01.06.2009    source источник


Ответы (2)


Вы хотели, чтобы Баз реализовал 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) {}
}

or

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

or

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

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

person Daniel Martin    schedule 01.06.2009
comment
хе-хе, я тоже собирался попытаться объяснить, почему это было неправильно... но я действительно не знаю, почему. :( - person jjnguy; 01.06.2009
comment
Что ж, вы получили свой ответ за несколько минут до того, как я получил свой, поэтому вы ухватились за просмотр единственного ответа и, если он хоть немного прав, проголосуйте за него, что стоит от +2 до +7, в зависимости от вопроса и времени. дня. (И вы знаете, что ваш ответ тоже не скомпилируется, верно?) - person Daniel Martin; 01.06.2009
comment
Baz абстрактен, поэтому я собирался позволить конкретным подклассам выбирать T. Ваш второй вариант, вероятно, наиболее близок к тому, что я хотел сделать. И да, странно, что он включает все дженерики, а не только T. Вот что меня поставило в тупик. Спасибо. - person Brian Deterling; 02.06.2009
comment
Я знаю, что выкапываю мертвых, но может ли кто-нибудь указать мне, почему это происходит (поэтому все дженерики отключены) - person psychollek; 04.08.2017

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

public abstract class Baz implements Foo {

к этому:

public abstract class Baz implements Foo<T> {

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

person jjnguy    schedule 01.06.2009