Ошибка стирания 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
.