[Technical Issue] Java OOP subtyping
Здравейте,
Имам малък проблем с разбирането на subtyping-a при Java List-вете. Става въпрос за първа задача от домашното. Пускам по-долу скелета на класовете
public class Vertex2D {
private double x;
private double y;
}
public class Vertex3D extends Vertex2D {
private double z;
}
public abstract class Shape {
protected List<? extends Vertex2D> vertices;
public Shape() {
}
public Shape(List<? extends Vertex2D> vertices) {
this.vertices = vertices;
}
}
public class PlaneShape extends Shape {
private Vertex2D vertex;
public PlaneShape(Vertex2D vertex) {
this.vertices = new ArrayList<Vertex2D>();
this.vertices.add(vertex); // compile error
// The method add(capture#2-of ? extends Vertex2D)
// in the type List<capture#2-of ? extends Vertex2D>
// is not applicable for the arguments (Vertex2D)
}
}
Не мога да разбера защо при инициализация на конструктора на PlaneShape въпреки, че this.vertices става new ArrayList<Vertex2D>() не мога да вкарам в него променлива от тип Vertex2D.
В същото време това решение по-долу работи без проблем
public PlaneShape(Vertex2D vertex) {
List<Vertex2D> verticesArray = new ArrayList<Vertex2D>();
verticesArray.add(vertex);
this.vertices = verticesArray;
}
Явно, че пропускам нещо но не мога да разбера какво, затова всякаква помощ е добре дошла.
ROYAL, четох го този пример вчера но той не покрива случаят, който съм описал.
В примера имаме два класа NaturalNumber и EvenNumber - NaturalNumber е по-големият от EvenNumber и при това положение е нормално долните два реда да връщат грешка
List<? extends NaturalNumber> ln = new ArrayList<EvenNumber>();
ln.add(new NaturalNumber(35));
Т.е. не можем да сложим обект от родителският тип в лист от типа на наследника.
В моят случай обаче това не е така, защото имаме
protected List<? extends Vertex2D> vertices = new ArrayList<Vertex2D>(); //направи List в който можем да сложим обекти от тип Vertex2D или от неговите наследници.
this.vertices.add(Vertex2D vertex); //сложи обект от тип Vertex2D в List в който можеш да слагаш обекти от тип Vertex2D или негови наследници. Връща compile error.
В моят пример поне аз не виждам конфликт в йерархията на класовете.
Нямам нищо във Vertex; Просто го създадох като абстракция, която да използвам във Shape. Не харесвам празни класове, но това е заобиколно решение.