/ / Генеричен тип собственост на суперкласа, изгубен в подклас с никакъв тип обвързан [дубликат] - java, generics

Общ тип собственост на суперкласа, изгубен в подкласа без обвързан тип [дубликат] - java, generics

Ето един патологичен пример с генерични данни в Java. Какво става тук?

public abstract class Foo<X> {

private List<String> stuff;

public List<String> getStuff() {
return stuff;
}

public void setStuff(List<String> stuff) {
this.stuff = stuff;
}
}

След това създадох подклас, но не посочих обвързания тип, който трябва да го направи обект.

public class Bar extends Foo {

public Bar() {
setStuff(new ArrayList<>());
}

public void whatIsGoingOnHere() {

for(String thing : getStuff())
System.out.println("Why is this a compiler error???");
}
}

Защо това е грешка в компилатора?

Отговори:

-2 за отговор № 1

Обаждате се setStuff(new ArrayList<>());, Тук ArrayList <> не е обвързана, тя се извежда от компилатора, ако може. setStuff е setStuff(List<String>), Така че компилаторът знае, че е ArrayList<String> и използва (извежда) това.

Вашият цикъл преминава през List<String> като върнати от getStuff() метод, така че дефиниране на thing като String (или всеки супер клас или интерфейс) ще бъде добре за компилатора.

Базовият клас има X тип, но няма значение, тъй като списъкът ви с материали е деклариран с тип. Само ако определите неща като List<X> би имало значение какво е определено за подкласа X.