Ето един патологичен пример с генерични данни в 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
.