a List następnie Dlaczego kod (poniżej) kompiluje? Z pewnością MyClass2
powinien zwrócić List<Integer>
?Dlaczego ta klasa się kompiluje, mimo że nie implementuje poprawnie swojego interfejsu?
public class Main {
public static void main(final String[] args) {
MyClass myClass = new MyClass();
List list = myClass.getList();
System.out.println(list);
System.out.println(list.get(0).getClass());
MyClass2 myClass2 = new MyClass2();
List list2 = myClass2.getList();
System.out.println(list2);
System.out.println(list2.get(0).getClass());
}
public interface Int1 {
public List getList();
}
public interface Int2 extends Int1 {
@Override
public List<Integer> getList();
}
public static class MyClass implements Int2 {
@Override
public List<Integer> getList() {
return Arrays.asList(1, 2, 3);
}
}
public static class MyClass2 implements Int2 {
@Override
public List getList() {
return Arrays.asList("One", "Two", "Three");
}
}
}
Zauważyłem, jeśli starają się zrobić to List<String>
następnie pojawi się błąd „Java: Main.MyClass2 nie jest abstrakcyjna i nie zastępują metody abstrakcyjne getlist() w Main.Int2”. Nie do końca rozumiem, dlaczego nie dostałeś tego w powyższym przykładzie.
Uwaga: Rozwiązaniem problemu w moim projekcie jest stworzenie interfejsu jako generycznego, tj. Int1<X>
(oczywiście używam lepszych nazw niż to, jest to tylko przykład).
Powinieneś mieć ostrzeżenia na wyjściu kompilatora. – fge
Ponieważ Java Generics zasysa. – schlingel